]> granicus.if.org Git - p11-kit/commitdiff
rpc: Allow empty CK_DATE value
authorDaiki Ueno <dueno@redhat.com>
Wed, 25 Sep 2019 13:41:04 +0000 (15:41 +0200)
committerDaiki Ueno <ueno@gnu.org>
Mon, 30 Sep 2019 09:02:49 +0000 (11:02 +0200)
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

p11-kit/rpc-message.c
p11-kit/test-rpc.c

index 228627e7e81936fe6d7a46e13962c07b81118d38..672d1c7b8770e97f1a60fc7972469f986aa4ce0c 100644 (file)
@@ -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;
 }
index 09f30e0d0476ca366e88e5f21b6649a1373424ff..a4cb687aae7b39d2b075dbac945bc9cada1720ea 100644 (file)
@@ -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");