summaryrefslogtreecommitdiff
path: root/p11-kit/rpc-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'p11-kit/rpc-server.c')
-rw-r--r--p11-kit/rpc-server.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/p11-kit/rpc-server.c b/p11-kit/rpc-server.c
index 1eebf1b..47beed0 100644
--- a/p11-kit/rpc-server.c
+++ b/p11-kit/rpc-server.c
@@ -400,9 +400,8 @@ static CK_RV
proto_read_mechanism (p11_rpc_message *msg,
CK_MECHANISM_PTR mech)
{
- const unsigned char *data;
- uint32_t value;
- size_t n_data;
+ size_t offset;
+ CK_MECHANISM temp;
assert (msg != NULL);
assert (mech != NULL);
@@ -411,17 +410,31 @@ proto_read_mechanism (p11_rpc_message *msg,
/* Make sure this is in the right order */
assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
- /* The mechanism type */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
+ /* Check the length needed to store the parameter */
+ memset (&temp, 0, sizeof (temp));
+ offset = msg->parsed;
+ if (!p11_rpc_buffer_get_mechanism (msg->input, &offset, &temp)) {
+ msg->parsed = offset;
return PARSE_ERROR;
+ }
- /* The mechanism data */
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
+ mech->mechanism = temp.mechanism;
+
+ /* The mechanism doesn't require parameter */
+ if (temp.ulParameterLen == 0) {
+ mech->pParameter = NULL;
+ mech->ulParameterLen = 0;
+ msg->parsed = offset;
+ return CKR_OK;
+ }
+
+ /* Actually retrieve the parameter */
+ mech->pParameter = p11_rpc_message_alloc_extra (msg, temp.ulParameterLen);
+ if (!p11_rpc_buffer_get_mechanism (msg->input, &msg->parsed, mech))
return PARSE_ERROR;
- mech->mechanism = value;
- mech->pParameter = (CK_VOID_PTR)data;
- mech->ulParameterLen = n_data;
+ assert (msg->parsed == offset);
+
return CKR_OK;
}