summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2015-06-23 16:46:43 +0200
committerStef Walter <stefw@redhat.com>2015-06-29 13:48:46 +0200
commitc9095cb154cfd9937332b1a980316d10a9655d51 (patch)
tree092e9e1bd6c361796e5dae431165f7ab03475684
parentc562aff333bd73a3fe5c15d2969a4ea70300a426 (diff)
downloadp11-kit-c9095cb154cfd9937332b1a980316d10a9655d51.tar.gz
Added test case for crash after a fork in proxy module
Reviewed-by: Stef Walter <stefw@redhat.com>
-rw-r--r--p11-kit/test-proxy.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/p11-kit/test-proxy.c b/p11-kit/test-proxy.c
index e4998be..96b9ada 100644
--- a/p11-kit/test-proxy.c
+++ b/p11-kit/test-proxy.c
@@ -52,6 +52,9 @@
#include <string.h>
#include <time.h>
#include <unistd.h>
+#ifndef _WIN32
+#include <sys/wait.h>
+#endif
/* This is the proxy module entry point in proxy.c, and linked to this test */
CK_RV C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list);
@@ -110,6 +113,44 @@ test_initialize_multiple (void)
p11_proxy_module_cleanup ();
}
+#ifndef _WIN32
+static void
+test_deinit_after_fork (void)
+{
+ CK_FUNCTION_LIST_PTR proxy;
+ CK_RV rv;
+ pid_t pid;
+ int st;
+
+ rv = C_GetFunctionList (&proxy);
+ assert (rv == CKR_OK);
+
+ assert (p11_proxy_module_check (proxy));
+
+ rv = proxy->C_Initialize(NULL);
+ assert_num_eq (rv, CKR_OK);
+
+ pid = fork ();
+ if (!pid) {
+ exit(0);
+ }
+ assert (pid != -1);
+ waitpid(pid, &st, 0);
+
+ rv = proxy->C_Finalize (NULL);
+ assert_num_eq (rv, CKR_OK);
+
+ p11_proxy_module_cleanup ();
+
+ /* If the assertion fails, p11_kit_failed() doesn't return. So make
+ * sure we do all the cleanup before the (expected) failure, or it
+ * causes all the *later* tests to fail too! */
+ if (!WIFEXITED (st) || WEXITSTATUS(st) != 0)
+ assert_fail("Child failed to C_Initialize() and C_Finalize()", NULL);
+
+}
+#endif
+
static CK_FUNCTION_LIST_PTR
setup_mock_module (CK_SESSION_HANDLE *session)
{
@@ -128,7 +169,7 @@ setup_mock_module (CK_SESSION_HANDLE *session)
mock_slots_all = 32;
rv = proxy->C_GetSlotList (CK_FALSE, slots, &mock_slots_all);
assert (rv == CKR_OK);
- assert (mock_slots_all >= 2);
+ assert_num_cmp (mock_slots_all, >=, 2);
/* Assume this is the slot we want to deal with */
mock_slot_one_id = slots[0];
@@ -188,6 +229,9 @@ main (int argc,
p11_test (test_initialize_finalize, "/proxy/initialize-finalize");
p11_test (test_initialize_multiple, "/proxy/initialize-multiple");
+#ifndef _WIN32
+ p11_test (test_deinit_after_fork, "/proxy/deinit-after-fork");
+#endif
test_mock_add_tests ("/proxy");