/*
- * Copyright (C) 2011-2012 ANSSI
+ * Copyright (C) 2011-2015 ANSSI
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
return NULL;
}
}
- if (length > max_size)
+ if (length == UINT32_MAX || length > max_size) {
+ if (errcode)
+ *errcode = ERR_DER_ELEMENT_SIZE_TOO_BIG;
return NULL;
+ }
a = Asn1GenericNew();
if (a == NULL)
return NULL;
}
}
- if (length > max_size)
+ if (length == UINT32_MAX || length > max_size) {
+ if (errcode)
+ *errcode = ERR_DER_ELEMENT_SIZE_TOO_BIG;
return NULL;
+ }
a = Asn1GenericNew();
if (a == NULL)
return NULL;
}
}
- if (length > max_size)
+ if (length == UINT32_MAX || length > max_size) {
+ if (errcode)
+ *errcode = ERR_DER_ELEMENT_SIZE_TOO_BIG;
return NULL;
+ }
a = Asn1GenericNew();
if (a == NULL)
}
}
node->length = d_length + (d_ptr - buffer);
- if (node->length > max_size) {
+ if (node->length > max_size || node->length < d_length /* wrap */) {
+ if (errcode)
+ *errcode = ERR_DER_ELEMENT_SIZE_TOO_BIG;
SCFree(node);
return NULL;
}
Asn1Generic *child = DecodeAsn1DerGeneric(d_ptr, el_max_size, depth, seq_index, errcode);
if (child == NULL) {
+ if (errcode && *errcode != 0) {
+ DerFree(node);
+ return NULL;
+ }
break;
}
}
node->length = d_length + (d_ptr - buffer);
- if (node->length > max_size) {
+ if (node->length > max_size || node->length < d_length /* wrap */) {
if (errcode)
*errcode = ERR_DER_ELEMENT_SIZE_TOO_BIG;
SCFree(node);
el_max_size = max_size - (d_ptr-buffer);
child = DecodeAsn1DerGeneric(d_ptr, el_max_size, depth, seq_index, errcode);
+ if (child == NULL) {
+ DerFree(node);
+ return NULL;
+ }
node->data = child;