Trap an invalid ASN1_ITEM construction and print out
the errant field for more ASN1 error conditions.
This commit is contained in:
parent
f196522159
commit
b31cc2d9f7
@ -1083,6 +1083,7 @@ int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it);
|
|||||||
#define ASN1_R_ILLEGAL_CHARACTERS 124
|
#define ASN1_R_ILLEGAL_CHARACTERS 124
|
||||||
#define ASN1_R_ILLEGAL_NULL 125
|
#define ASN1_R_ILLEGAL_NULL 125
|
||||||
#define ASN1_R_ILLEGAL_OPTIONAL_ANY 126
|
#define ASN1_R_ILLEGAL_OPTIONAL_ANY 126
|
||||||
|
#define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170
|
||||||
#define ASN1_R_ILLEGAL_TAGGED_ANY 127
|
#define ASN1_R_ILLEGAL_TAGGED_ANY 127
|
||||||
#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128
|
#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128
|
||||||
#define ASN1_R_INVALID_BMPSTRING_LENGTH 129
|
#define ASN1_R_INVALID_BMPSTRING_LENGTH 129
|
||||||
|
@ -172,6 +172,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
|
|||||||
{ASN1_R_ILLEGAL_CHARACTERS ,"illegal characters"},
|
{ASN1_R_ILLEGAL_CHARACTERS ,"illegal characters"},
|
||||||
{ASN1_R_ILLEGAL_NULL ,"illegal null"},
|
{ASN1_R_ILLEGAL_NULL ,"illegal null"},
|
||||||
{ASN1_R_ILLEGAL_OPTIONAL_ANY ,"illegal optional any"},
|
{ASN1_R_ILLEGAL_OPTIONAL_ANY ,"illegal optional any"},
|
||||||
|
{ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE ,"illegal options on item template"},
|
||||||
{ASN1_R_ILLEGAL_TAGGED_ANY ,"illegal tagged any"},
|
{ASN1_R_ILLEGAL_TAGGED_ANY ,"illegal tagged any"},
|
||||||
{ASN1_R_INTEGER_TOO_LARGE_FOR_LONG ,"integer too large for long"},
|
{ASN1_R_INTEGER_TOO_LARGE_FOR_LONG ,"integer too large for long"},
|
||||||
{ASN1_R_INVALID_BMPSTRING_LENGTH ,"invalid bmpstring length"},
|
{ASN1_R_INVALID_BMPSTRING_LENGTH ,"invalid bmpstring length"},
|
||||||
|
@ -132,8 +132,18 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, unsigned char **in, long len, const ASN1
|
|||||||
switch(it->itype) {
|
switch(it->itype) {
|
||||||
|
|
||||||
case ASN1_ITYPE_PRIMITIVE:
|
case ASN1_ITYPE_PRIMITIVE:
|
||||||
if(it->templates)
|
if(it->templates) {
|
||||||
|
/* tagging or OPTIONAL is currently illegal on an item template
|
||||||
|
* because the flags can't get passed down. In practice this isn't
|
||||||
|
* a problem: we include the relevant flags from the item template
|
||||||
|
* in the template itself.
|
||||||
|
*/
|
||||||
|
if ((tag != -1) || opt) {
|
||||||
|
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
return asn1_template_ex_d2i(pval, in, len, it->templates, opt, ctx);
|
return asn1_template_ex_d2i(pval, in, len, it->templates, opt, ctx);
|
||||||
|
}
|
||||||
return asn1_d2i_ex_primitive(pval, in, len, it, tag, aclass, opt, ctx);
|
return asn1_d2i_ex_primitive(pval, in, len, it, tag, aclass, opt, ctx);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -232,21 +242,21 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, unsigned char **in, long len, const ASN1
|
|||||||
/* Otherwise must be an ASN1 parsing error */
|
/* Otherwise must be an ASN1 parsing error */
|
||||||
errtt = tt;
|
errtt = tt;
|
||||||
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR);
|
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR);
|
||||||
return 0;
|
goto err;
|
||||||
}
|
}
|
||||||
/* Did we fall off the end without reading anything? */
|
/* Did we fall off the end without reading anything? */
|
||||||
if(i == it->tcount) {
|
if(i == it->tcount) {
|
||||||
/* If OPTIONAL, this is OK */
|
/* If OPTIONAL, this is OK */
|
||||||
if(opt) return -1;
|
if(opt) return -1;
|
||||||
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_NO_MATCHING_CHOICE_TYPE);
|
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_NO_MATCHING_CHOICE_TYPE);
|
||||||
return 0;
|
goto err;
|
||||||
}
|
}
|
||||||
/* Otherwise we got a match, allocate structure and populate it */
|
/* Otherwise we got a match, allocate structure and populate it */
|
||||||
if(!*pval) {
|
if(!*pval) {
|
||||||
if(!ASN1_item_ex_new(pval, it)) {
|
if(!ASN1_item_ex_new(pval, it)) {
|
||||||
errtt = tt;
|
errtt = tt;
|
||||||
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR);
|
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ERR_R_NESTED_ASN1_ERROR);
|
||||||
return 0;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pchptr = asn1_get_field_ptr(pval, tt);
|
pchptr = asn1_get_field_ptr(pval, tt);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user