]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Fix asn1_get_length_der usage.
authorSimon Josefsson <simon@josefsson.org>
Wed, 8 Feb 2006 17:03:28 +0000 (17:03 +0000)
committerSimon Josefsson <simon@josefsson.org>
Wed, 8 Feb 2006 17:03:28 +0000 (17:03 +0000)
lib/minitasn1/element.c
lib/minitasn1/structure.c

index 35ae24fd995a564abea5eeecf1ce36b29deec0bf..ea3a1769ca48715dee6b3573afe9bba9cfb1d555 100644 (file)
@@ -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:
index 4ed0f0bf66f458a908c27fe37ad33ffc1eb7cc84..46bc8abe84da81d7ace68dd0e8593d0a28a7a292 100644 (file)
@@ -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: