From: Daiki Ueno Date: Wed, 25 Sep 2019 13:41:04 +0000 (+0200) Subject: rpc: Allow empty CK_DATE value X-Git-Tag: 0.23.18~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fde84c52f4ffd0b274ce92e5f935060e86f0a5f7;p=p11-kit rpc: Allow empty CK_DATE value Unlike other data types, CK_DATE value may be empty (and that is the default). Treat it as a valid value and serialize/deserialize accordingly. Reported by Vincent JARDIN in: https://github.com/p11-glue/p11-kit/issues/244 --- diff --git a/p11-kit/rpc-message.c b/p11-kit/rpc-message.c index 228627e..672d1c7 100644 --- a/p11-kit/rpc-message.c +++ b/p11-kit/rpc-message.c @@ -983,18 +983,20 @@ p11_rpc_buffer_add_date_value (p11_buffer *buffer, CK_DATE date_value; unsigned char array[8]; - /* Check if value can be converted to CK_DATE. */ - if (value_length != sizeof (CK_DATE)) { + /* Check if value is empty or can be converted to CK_DATE. */ + if (value_length != 0 && value_length != sizeof (CK_DATE)) { p11_buffer_fail (buffer); return; } - memcpy (&date_value, value, value_length); - memcpy (array, date_value.year, 4); - memcpy (array + 4, date_value.month, 2); - memcpy (array + 6, date_value.day, 2); + if (value_length == sizeof (CK_DATE)) { + memcpy (&date_value, value, value_length); + memcpy (array, date_value.year, 4); + memcpy (array + 4, date_value.month, 2); + memcpy (array + 6, date_value.day, 2); + } - p11_rpc_buffer_add_byte_array (buffer, array, 8); + p11_rpc_buffer_add_byte_array (buffer, array, value_length); } void @@ -1165,12 +1167,13 @@ p11_rpc_buffer_get_date_value (p11_buffer *buffer, const unsigned char *array; size_t array_length; + /* The encoded date may be empty. */ if (!p11_rpc_buffer_get_byte_array (buffer, offset, &array, &array_length) || - array_length != 8) + (array_length != 0 && array_length != sizeof (CK_DATE))) return false; - if (value) { + if (value && array_length == sizeof (CK_DATE)) { memcpy (date_value.year, array, 4); memcpy (date_value.month, array + 4, 2); memcpy (date_value.day, array + 6, 2); @@ -1178,7 +1181,7 @@ p11_rpc_buffer_get_date_value (p11_buffer *buffer, } if (value_length) - *value_length = sizeof (CK_DATE); + *value_length = array_length; return true; } diff --git a/p11-kit/test-rpc.c b/p11-kit/test-rpc.c index 09f30e0..a4cb687 100644 --- a/p11-kit/test-rpc.c +++ b/p11-kit/test-rpc.c @@ -543,6 +543,28 @@ test_date_value (void) p11_buffer_uninit (&buffer); } +static void +test_date_value_empty (void) +{ + p11_buffer buffer; + CK_DATE val; + size_t offset = 0; + CK_ULONG val_size; + bool ret; + + p11_buffer_init (&buffer, 0); + + p11_rpc_buffer_add_date_value(&buffer, NULL, 0); + assert (!p11_buffer_failed (&buffer)); + + ret = p11_rpc_buffer_get_date_value(&buffer, &offset, &val, &val_size); + assert_num_eq (true, ret); + + assert_num_eq (0, val_size); + + p11_buffer_uninit (&buffer); +} + static void test_byte_array_value (void) { @@ -1349,6 +1371,7 @@ main (int argc, p11_test (test_attribute_array_value, "/rpc/attribute-array-value"); p11_test (test_mechanism_type_array_value, "/rpc/mechanism-type-array-value"); p11_test (test_date_value, "/rpc/date-value"); + p11_test (test_date_value_empty, "/rpc/date-value-empty"); p11_test (test_byte_array_value, "/rpc/byte-array-value"); p11_test (test_mechanism_value, "/rpc/mechanism-value"); p11_test (test_message_write, "/rpc/message-write");