diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2015-06-23 16:46:43 +0200 |
---|---|---|
committer | Stef Walter <stefw@redhat.com> | 2015-06-29 13:48:46 +0200 |
commit | c9095cb154cfd9937332b1a980316d10a9655d51 (patch) | |
tree | 092e9e1bd6c361796e5dae431165f7ab03475684 /p11-kit | |
parent | c562aff333bd73a3fe5c15d2969a4ea70300a426 (diff) |
Added test case for crash after a fork in proxy module
Reviewed-by: Stef Walter <stefw@redhat.com>
Diffstat (limited to 'p11-kit')
-rw-r--r-- | p11-kit/test-proxy.c | 46 |
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"); |