]> granicus.if.org Git - p11-kit/commitdiff
trust: Correctly rewrite other objects in a modifiable persist file
authorStef Walter <stef@thewalter.net>
Tue, 27 Aug 2013 19:24:34 +0000 (21:24 +0200)
committerStef Walter <stef@thewalter.net>
Wed, 28 Aug 2013 19:51:05 +0000 (21:51 +0200)
There was a bug where we were rewriting the modified object
multiple times.

trust/tests/test-token.c
trust/token.c

index a028d9c05b9778a7ce8ba1b5063a3a06c99380c6..855b56bd277dcf44eeb73a900913680265b9b3ae 100644 (file)
@@ -585,6 +585,79 @@ test_write_no_label (void)
        test_check_attrs (expected, parsed->elem[0]);
 }
 
+static void
+test_modify_multiple (void)
+{
+       const char *test_data =
+               "[p11-kit-object-v1]\n"
+               "class: data\n"
+               "label: \"first\"\n"
+               "value: \"1\"\n"
+               "\n"
+               "[p11-kit-object-v1]\n"
+               "class: data\n"
+               "label: \"second\"\n"
+               "value: \"2\"\n"
+               "\n"
+               "[p11-kit-object-v1]\n"
+               "class: data\n"
+               "label: \"third\"\n"
+               "value: \"3\"\n";
+
+       CK_ATTRIBUTE first[] = {
+               { CKA_CLASS, &data, sizeof (data) },
+               { CKA_LABEL, "first", 5 },
+               { CKA_VALUE, "1", 1 },
+               { CKA_INVALID },
+       };
+
+       CK_ATTRIBUTE second[] = {
+               { CKA_CLASS, &data, sizeof (data) },
+               { CKA_LABEL, "zwei", 4 },
+               { CKA_VALUE, "2", 2 },
+               { CKA_INVALID },
+       };
+
+       CK_ATTRIBUTE third[] = {
+               { CKA_CLASS, &data, sizeof (data) },
+               { CKA_LABEL, "third", 5 },
+               { CKA_VALUE, "3", 1 },
+               { CKA_INVALID },
+       };
+
+       CK_ATTRIBUTE match = { CKA_LABEL, "second", 6 };
+
+       CK_OBJECT_HANDLE handle;
+       p11_array *parsed;
+       char *path;
+       int ret;
+       CK_RV rv;
+
+       test_write_file (test.directory, "Test.p11-kit", test_data, strlen (test_data));
+
+       /* Reload now that we have this new file */
+       p11_token_load (test.token);
+
+       handle = p11_index_find (test.index, &match, 1);
+
+       rv = p11_index_update (test.index, handle, p11_attrs_dup (second));
+       assert_num_eq (rv, CKR_OK);
+
+       /* Now read in the file and make sure it has all the objects */
+       path = p11_path_build (test.directory, "Test.p11-kit", NULL);
+       ret = p11_parse_file (test.parser, path, NULL, 0);
+       assert_num_eq (ret, P11_PARSE_SUCCESS);
+       free (path);
+
+       parsed = p11_parser_parsed (test.parser);
+       assert_num_eq (parsed->num, 3);
+
+       /* The modified one will be first */
+       test_check_attrs (second, parsed->elem[0]);
+       test_check_attrs (first, parsed->elem[1]);
+       test_check_attrs (third, parsed->elem[2]);
+}
+
 int
 main (int argc,
       char *argv[])
@@ -611,6 +684,7 @@ main (int argc,
        p11_test (test_reload_no_origin, "/token/reload-no-origin");
        p11_test (test_write_new, "/token/write-new");
        p11_test (test_write_no_label, "/token/write-no-label");
+       p11_test (test_modify_multiple, "/token/modify-multiple");
 
        return p11_test_run (argc, argv);
 }
index 22363f8d395d3c0a108493e52d1fb47a5199e5da..8670ff4818d7c9842758a114c24172a0e94cb0e5 100644 (file)
@@ -673,7 +673,7 @@ on_index_store (void *data,
 
        for (i = 0; rv == CKR_OK && other && other[i] != 0; i++) {
                if (other[i] != handle) {
-                       object = p11_index_lookup (index, handle);
+                       object = p11_index_lookup (index, other[i]);
                        if (object != NULL)
                                rv = writer_put_object (file, persist, &buffer, object);
                }