asn1_length_der (tot_len, temp, &len2);
_asn1_set_value (node, temp, len2);
- tot_len += len2;
-
ret = _asn1_extract_der_octet (node, der, *len);
if (ret != ASN1_SUCCESS)
return ret;
len2 = asn1_get_length_der (der, *len, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
- if (node)
- _asn1_set_value (node, der, len3 + len2);
+
counter = len3 + len2;
+ if (node)
+ _asn1_set_value (node, der, counter);
}
*len = counter;
p = node;
while (1)
{
+ if (p == NULL)
+ return ASN1_DER_ERROR;
+
ris = ASN1_SUCCESS;
if (move != UP)
if (p->type & CONST_SET)
{
p2 = _asn1_find_up (p);
+ if (p2 == NULL)
+ return ASN1_DER_ERROR;
+
len2 = _asn1_strtol (p2->value, NULL, 10);
if (len2 == -1)
{
}
else if (counter > len2)
return ASN1_DER_ERROR;
+
p2 = p2->down;
+
while (p2)
{
if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
else
{
p3 = p2->down;
+ if (p3 == NULL)
+ return ASN1_DER_ERROR;
+
ris =
_asn1_extract_tag_der (p3, der + counter,
len - counter, &len2);
if (type_field (p->type) == TYPE_CHOICE)
{
p = p->down;
+ if (p == NULL)
+ return ASN1_DER_ERROR;
+
ris =
_asn1_extract_tag_der (p, der + counter, len - counter,
&len2);