summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2014-08-20 16:19:53 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2014-08-20 16:20:58 +0200
commit7f21e2301d2ed2c63aa4adb02d1d02e31d8c2ca7 (patch)
treed640d2b3e7284fb2f5342eb5e9f76d4efb8ca58e
parent57796ca5f5e4c788cfb65baee6485179de4dd3db (diff)
downloadlibtasn1-7f21e2301d2ed2c63aa4adb02d1d02e31d8c2ca7.tar.gz
corrected check for infinite encoding
Conflicts: lib/decoding.c
-rw-r--r--lib/decoding.c10
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;