Fix C_GetAttributeValue for attr with 0 length
This commit is contained in:
parent
c9d6c30a83
commit
ccdb314d49
|
@ -4348,6 +4348,16 @@ pkcs15_dobj_get_value(struct sc_pkcs11_session *session,
|
||||||
|
|
||||||
if (!out_data)
|
if (!out_data)
|
||||||
return SC_ERROR_INVALID_ARGUMENTS;
|
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];
|
fw_data = (struct pkcs15_fw_data *) p11card->fws_data[session->slot->fw_data_idx];
|
||||||
if (!fw_data)
|
if (!fw_data)
|
||||||
return sc_to_cryptoki_error(SC_ERROR_INTERNAL, "C_GetAttributeValue");
|
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)
|
if (!attr || !data)
|
||||||
return CKR_ATTRIBUTE_VALUE_INVALID;
|
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,
|
sc_log(context,
|
||||||
"data_value_to_attr(): data(%p,len:%"SC_FORMAT_LEN_SIZE_T"u)",
|
"data_value_to_attr(): data(%p,len:%"SC_FORMAT_LEN_SIZE_T"u)",
|
||||||
data, data->data_len);
|
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)
|
if (rv == CKR_OK)
|
||||||
rv = data_value_to_attr(attr, data);
|
rv = data_value_to_attr(attr, data);
|
||||||
if (data) {
|
if (data) {
|
||||||
free(data->data);
|
if (data->data)
|
||||||
|
free(data->data);
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
if (rv != CKR_OK)
|
if (rv != CKR_OK)
|
||||||
|
|
Loading…
Reference in New Issue