diff options
author | Simon Josefsson <simon@josefsson.org> | 2006-02-08 17:03:28 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2006-02-08 17:03:28 +0000 |
commit | 4e12a0ae7fc5a3dff9df49a3a3b8f6cd28dc58cd (patch) | |
tree | 31433a07e095a32ac4dba512641c5e8c52ce06f1 | |
parent | 0ba523abc8c2cc6f205fd186983d0a331d9d4409 (diff) | |
download | gnutls-4e12a0ae7fc5a3dff9df49a3a3b8f6cd28dc58cd.tar.gz |
Fix asn1_get_length_der usage.
-rw-r--r-- | lib/minitasn1/element.c | 1 | ||||
-rw-r--r-- | lib/minitasn1/structure.c | 25 |
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/minitasn1/element.c b/lib/minitasn1/element.c index 35ae24fd99..ea3a1769ca 100644 --- a/lib/minitasn1/element.c +++ b/lib/minitasn1/element.c @@ -725,6 +725,7 @@ asn1_read_value(ASN1_TYPE root,const char *name,void* ivalue, int *len) case TYPE_ANY: len3=-1; len2=_asn1_get_length_der(node->value,node->value_len,&len3); + if (len2 < 0) return ASN1_DER_ERROR; PUT_VALUE( value, value_size, node->value+len3, len2); break; default: diff --git a/lib/minitasn1/structure.c b/lib/minitasn1/structure.c index 4ed0f0bf66..46bc8abe84 100644 --- a/lib/minitasn1/structure.c +++ b/lib/minitasn1/structure.c @@ -1,6 +1,6 @@ /* + * Copyright (C) 2004, 2006 Free Software Foundation * Copyright (C) 2002 Fabio Fiorina - * Copyright (C) 2004 Simon Josefsson * * This file is part of LIBASN1. * @@ -363,6 +363,7 @@ _asn1_copy_structure3(node_asn *source_node) case TYPE_INTEGER: len2=-1; len=_asn1_get_length_der(p_s->value,p_s->value_len,&len2); + if (len < 0) return NULL; _asn1_set_value(p_d,p_s->value,len+len2); break; default: @@ -728,7 +729,8 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) len2=-1; len=_asn1_get_length_der(p->value,p->value_len,&len2); fprintf(out," value:0x"); - for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + if (len > 0) + for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); } break; case TYPE_ENUMERATED: @@ -736,7 +738,8 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) len2=-1; len=_asn1_get_length_der(p->value,p->value_len,&len2); fprintf(out," value:0x"); - for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + if (len > 0) + for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); } break; case TYPE_TIME: @@ -752,8 +755,11 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) if(p->value){ len2=-1; len=_asn1_get_length_der(p->value,p->value_len,&len2); - fprintf(out," value(%i):",(len-1)*8-(p->value[len2])); - for(k=1;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + if (len>0) + { + fprintf(out," value(%i):",(len-1)*8-(p->value[len2])); + for(k=1;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + } } break; case TYPE_OCTET_STRING: @@ -761,7 +767,8 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) len2=-1; len=_asn1_get_length_der(p->value,p->value_len,&len2); fprintf(out," value:"); - for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + if (len>0) + for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); } break; case TYPE_GENERALSTRING: @@ -769,7 +776,8 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) len2=-1; len=_asn1_get_length_der(p->value,p->value_len,&len2); fprintf(out," value:"); - for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); + if (len>0) + for(k=0;k<len;k++) fprintf(out,"%02x",(p->value)[k+len2]); } break; case TYPE_OBJECT_ID: @@ -780,7 +788,8 @@ asn1_print_structure(FILE *out,ASN1_TYPE structure,const char *name,int mode) len3=-1; len2=_asn1_get_length_der(p->value,p->value_len,&len3); fprintf(out," value:"); - for(k=0;k<len2;k++) fprintf(out,"%02x",(p->value)[k+len3]); + if (len2>0) + for(k=0;k<len2;k++) fprintf(out,"%02x",(p->value)[k+len3]); } break; case TYPE_SET: |