Fixes in _asn1_extract_der_octet() and usage of DECR_LEN().
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Fri, 16 May 2014 17:16:09 +0000 (19:16 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Fri, 16 May 2014 17:16:09 +0000 (19:16 +0200)
lib/decoding.c

index bfc9dac..a6ed982 100644 (file)
@@ -659,44 +659,51 @@ _asn1_extract_der_octet (asn1_node node, const unsigned char *der,
                         int der_len)
 {
   int len2, len3;
-  int counter2, counter_end;
+  int counter, counter_end;
+  int result;
 
   len2 = asn1_get_length_der (der, der_len, &len3);
   if (len2 < -1)
     return ASN1_DER_ERROR;
 
-  counter2 = len3 + 1;
+  counter = len3 + 1;
 
   if (len2 == -1)
     counter_end = der_len - 2;
   else
     counter_end = der_len;
 
-  while (counter2 < counter_end)
+  while (counter < counter_end)
     {
-      len2 = asn1_get_length_der (der + counter2, der_len - counter2, &len3);
+      len2 = asn1_get_length_der (der + counter, der_len, &len3);
 
       if (len2 < -1)
        return ASN1_DER_ERROR;
 
       if (len2 > 0)
        {
-         _asn1_append_value (node, der + counter2 + len3, len2);
+         DECR_LEN(der_len, len2+len3);
+         _asn1_append_value (node, der + counter + len3, len2);
        }
       else
        {                       /* indefinite */
-
-         len2 =
-           _asn1_extract_der_octet (node, der + counter2 + len3,
-                                    der_len - counter2 - len3);
-         if (len2 < 0)
-           return len2;
+         DECR_LEN(der_len, len3);
+         result =
+           _asn1_extract_der_octet (node, der + counter + len3,
+                                    der_len);
+         if (result != ASN1_SUCCESS)
+           return result;
+         DECR_LEN(der_len, len2);
        }
 
-      counter2 += len2 + len3 + 1;
+      DECR_LEN(der_len, 1);
+      counter += len2 + len3 + 1;
     }
 
   return ASN1_SUCCESS;
+
+cleanup:
+  return result;
 }
 
 static int