diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2014-08-20 16:19:53 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2014-08-20 16:20:58 +0200 |
commit | 7f21e2301d2ed2c63aa4adb02d1d02e31d8c2ca7 (patch) | |
tree | d640d2b3e7284fb2f5342eb5e9f76d4efb8ca58e | |
parent | 57796ca5f5e4c788cfb65baee6485179de4dd3db (diff) | |
download | libtasn1-7f21e2301d2ed2c63aa4adb02d1d02e31d8c2ca7.tar.gz |
corrected check for infinite encoding
Conflicts:
lib/decoding.c
-rw-r--r-- | lib/decoding.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/decoding.c b/lib/decoding.c index e7bd19f..4fbbabb 100644 --- a/lib/decoding.c +++ b/lib/decoding.c @@ -901,6 +901,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, unsigned char class; unsigned long tag; int indefinite, result; + int tag_len; const unsigned char *der = ider; node = *element; @@ -923,6 +924,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, p = node; while (1) { + tag_len = 0; ris = ASN1_SUCCESS; if (move != UP) { @@ -1050,7 +1052,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, if (ris == ASN1_SUCCESS) ris = - extract_tag_der_recursive (p, der + counter, ider_len, &len2); + extract_tag_der_recursive (p, der + counter, ider_len, &tag_len); if (ris != ASN1_SUCCESS) { @@ -1076,8 +1078,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, } else { - DECR_LEN(ider_len, len2); - counter += len2; + DECR_LEN(ider_len, tag_len); + counter += tag_len; } } @@ -1359,7 +1361,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, break; case ASN1_ETYPE_ANY: /* Check indefinite lenth method in an EXPLICIT TAG */ - if ((p->type & CONST_TAG) && (der[counter - 1] == 0x80)) + if ((p->type & CONST_TAG) && tag_len == 2 && (der[counter - 1] == 0x80)) indefinite = 1; else indefinite = 0; |