Fix C_GetAttributeValue for attr with 0 length

This commit is contained in:
konstantinpersidskiy 2018-04-10 23:59:38 -07:00 committed by Frank Morgner
parent c9d6c30a83
commit ccdb314d49
1 changed files with 20 additions and 1 deletions

View File

@ -4348,6 +4348,16 @@ pkcs15_dobj_get_value(struct sc_pkcs11_session *session,
if (!out_data)
return SC_ERROR_INVALID_ARGUMENTS;
if (dobj->info->data.len == 0)
/* CKA_VALUE is empty */
{
struct sc_pkcs15_data *data = calloc(sizeof(struct sc_pkcs15_data), 1);
data->data_len = 0;
data->data = NULL;
*out_data = data;
return SC_SUCCESS;
}
fw_data = (struct pkcs15_fw_data *) p11card->fws_data[session->slot->fw_data_idx];
if (!fw_data)
return sc_to_cryptoki_error(SC_ERROR_INTERNAL, "C_GetAttributeValue");
@ -4372,6 +4382,14 @@ data_value_to_attr(CK_ATTRIBUTE_PTR attr, struct sc_pkcs15_data *data)
if (!attr || !data)
return CKR_ATTRIBUTE_VALUE_INVALID;
if (data->data_len == 0)
/* value is empty */
{
attr->ulValueLen = data->data_len;
attr->pValue = NULL_PTR;
return CKR_OK;
}
sc_log(context,
"data_value_to_attr(): data(%p,len:%"SC_FORMAT_LEN_SIZE_T"u)",
data, data->data_len);
@ -4453,7 +4471,8 @@ pkcs15_dobj_get_attribute(struct sc_pkcs11_session *session, void *object, CK_AT
if (rv == CKR_OK)
rv = data_value_to_attr(attr, data);
if (data) {
free(data->data);
if (data->data)
free(data->data);
free(data);
}
if (rv != CKR_OK)