asn1: Fix open decode bug found by AFL
Should always run AFL before pushing changes to the ASN.1 compiler or template interpreter! Still fuzzing. There are crashers in the _asn1_print() path, though right now they cannot affect anything else in Heimdal other than asn1_print, since that's the only thing calling it yet.
This commit is contained in:
@@ -645,6 +645,7 @@ _asn1_decode_open_type(const struct asn1_template *t,
|
||||
* All the union arms are pointers.
|
||||
*/
|
||||
if (ret) {
|
||||
_asn1_free(tactual_type->ptr, o);
|
||||
free(o);
|
||||
/*
|
||||
* So we failed to decode the open type -- that should not be fatal
|
||||
@@ -688,26 +689,18 @@ _asn1_decode_open_type(const struct asn1_template *t,
|
||||
/* Increment the count of decoded values as we decode */
|
||||
*lenp = len;
|
||||
for (i = 0; ret != ENOMEM && i < len; i++) {
|
||||
if ((val[i] = calloc(len, tactual_type->offset)) == NULL)
|
||||
if ((val[i] = calloc(1, tactual_type->offset)) == NULL)
|
||||
ret = ENOMEM;
|
||||
if (ret == 0 && d[i])
|
||||
/* Re-enter to decode the encoded open type value */
|
||||
ret = _asn1_decode(tactual_type->ptr, flags, d[i]->data,
|
||||
d[i]->length, val[i], &sz);
|
||||
ret = _asn1_decode(tactual_type->ptr, flags, d[0][i].data,
|
||||
d[0][i].length, val[i], &sz);
|
||||
if (ret) {
|
||||
_asn1_free(tactual_type->ptr, val[i]);
|
||||
free(val[i]);
|
||||
val[i] = NULL;
|
||||
}
|
||||
}
|
||||
if (ret == ENOMEM) {
|
||||
for (i = 0; i < len; i++) {
|
||||
_asn1_free(tactual_type->ptr, val[i]);
|
||||
free(val[i]);
|
||||
}
|
||||
free(val);
|
||||
val = 0;
|
||||
*lenp = 0;
|
||||
}
|
||||
if (ret != ENOMEM)
|
||||
ret = 0; /* See above */
|
||||
*dp = val;
|
||||
|
Reference in New Issue
Block a user