signature-params: Only modify passed params if parsing succeeded
This avoids issues if a caller doesn't expect e.g. the scheme to get modified on failure.
This commit is contained in:
@@ -186,13 +186,13 @@ void signature_params_clear(signature_params_t *this)
|
|||||||
bool signature_params_parse(chunk_t asn1, int level0,
|
bool signature_params_parse(chunk_t asn1, int level0,
|
||||||
signature_params_t *params)
|
signature_params_t *params)
|
||||||
{
|
{
|
||||||
|
signature_params_t parsed = {};
|
||||||
chunk_t parameters = chunk_empty;
|
chunk_t parameters = chunk_empty;
|
||||||
int oid;
|
int oid;
|
||||||
|
|
||||||
oid = asn1_parse_algorithmIdentifier(asn1, level0, ¶meters);
|
oid = asn1_parse_algorithmIdentifier(asn1, level0, ¶meters);
|
||||||
params->scheme = signature_scheme_from_oid(oid);
|
parsed.scheme = signature_scheme_from_oid(oid);
|
||||||
params->params = NULL;
|
switch (parsed.scheme)
|
||||||
switch (params->scheme)
|
|
||||||
{
|
{
|
||||||
case SIGN_UNKNOWN:
|
case SIGN_UNKNOWN:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -206,7 +206,7 @@ bool signature_params_parse(chunk_t asn1, int level0,
|
|||||||
free(pss);
|
free(pss);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
params->params = pss;
|
parsed.params = pss;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -214,11 +214,12 @@ bool signature_params_parse(chunk_t asn1, int level0,
|
|||||||
!chunk_equals(parameters, chunk_from_chars(0x05, 0x00)))
|
!chunk_equals(parameters, chunk_from_chars(0x05, 0x00)))
|
||||||
{
|
{
|
||||||
DBG1(DBG_IKE, "unexpected parameters for %N",
|
DBG1(DBG_IKE, "unexpected parameters for %N",
|
||||||
signature_scheme_names, params->scheme);
|
signature_scheme_names, parsed.scheme);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
*params = parsed;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user