summaryrefslogtreecommitdiff
path: root/lib/decoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/decoding.c')
-rw-r--r--lib/decoding.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/lib/decoding.c b/lib/decoding.c
index 701df76..ecf9433 100644
--- a/lib/decoding.c
+++ b/lib/decoding.c
@@ -49,7 +49,7 @@
} while (0)
static int
-_asn1_get_indefinite_length_string (const unsigned char *der, int *len);
+_asn1_get_indefinite_length_string (const unsigned char *der, unsigned der_len, int *len);
static void
_asn1_error_description_tag_error (asn1_node node, char *ErrorDescription)
@@ -221,8 +221,7 @@ asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
ret = asn1_get_length_der (ber, ber_len, len);
if (ret == -1)
{ /* indefinite length method */
- ret = ber_len;
- err = _asn1_get_indefinite_length_string (ber + 1, &ret);
+ err = _asn1_get_indefinite_length_string (ber + 1, ber_len, &ret);
if (err != ASN1_SUCCESS)
return -3;
}
@@ -777,7 +776,8 @@ _asn1_get_octet_string (const unsigned char *der, asn1_node node, int *len)
}
static int
-_asn1_get_indefinite_length_string (const unsigned char *der, int *len)
+_asn1_get_indefinite_length_string (const unsigned char *der,
+ unsigned der_len, int *len)
{
int len2, len3, counter, indefinite;
unsigned long tag;
@@ -787,7 +787,7 @@ _asn1_get_indefinite_length_string (const unsigned char *der, int *len)
while (1)
{
- if (counter+1 >= *len)
+ if (counter+1 >= der_len)
return ASN1_DER_ERROR;
if ((der[counter] == 0) && (der[counter + 1] == 0))
@@ -801,13 +801,13 @@ _asn1_get_indefinite_length_string (const unsigned char *der, int *len)
}
if (asn1_get_tag_der
- (der + counter, *len - counter, &class, &len2,
+ (der + counter, der_len - counter, &class, &len2,
&tag) != ASN1_SUCCESS)
return ASN1_DER_ERROR;
- if (counter + len2 > *len)
+ if (counter + len2 > der_len)
return ASN1_DER_ERROR;
counter += len2;
- len2 = asn1_get_length_der (der + counter, *len - counter, &len3);
+ len2 = asn1_get_length_der (der + counter, der_len - counter, &len3);
if (len2 < -1)
return ASN1_DER_ERROR;
if (len2 == -1)
@@ -1376,9 +1376,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len,
else
indefinite = 0;
- len2 = ider_len;
result =
- _asn1_get_indefinite_length_string (der + counter, &len2);
+ _asn1_get_indefinite_length_string (der + counter, ider_len, &len2);
if (result != ASN1_SUCCESS)
{
warn();
@@ -1756,9 +1755,8 @@ asn1_der_decoding_startEnd (asn1_node element, const void *ider, int len,
else
indefinite = 0;
- len2 = len - counter;
ris =
- _asn1_get_indefinite_length_string (der + counter, &len2);
+ _asn1_get_indefinite_length_string (der + counter, len - counter, &len2);
if (ris != ASN1_SUCCESS)
return ris;
counter += len2;