diff options
-rw-r--r-- | p11-kit/modules.c | 9 | ||||
-rw-r--r-- | tests/Makefile.am | 10 | ||||
-rw-r--r-- | tests/test-recursive.c | 98 |
3 files changed, 114 insertions, 3 deletions
diff --git a/p11-kit/modules.c b/p11-kit/modules.c index c0a000a..d8b7814 100644 --- a/p11-kit/modules.c +++ b/p11-kit/modules.c @@ -109,6 +109,7 @@ typedef struct _Module { /* Initialized modules */ CK_C_INITIALIZE_ARGS init_args; int initialize_count; + int initializing; } Module; /* @@ -509,9 +510,13 @@ static CK_RV initialize_module_unlocked_reentrant (Module *mod) { CK_RV rv = CKR_OK; - assert (mod); + if (mod->initializing) { + _p11_message ("p11-kit initialization called recursively"); + return CKR_FUNCTION_FAILED; + } + /* * Increase ref first, so module doesn't get freed out from * underneath us when the mutex is unlocked below. @@ -520,6 +525,7 @@ initialize_module_unlocked_reentrant (Module *mod) if (!mod->initialize_count) { + mod->initializing = 1; debug ("C_Initialize: calling"); _p11_unlock (); @@ -530,6 +536,7 @@ initialize_module_unlocked_reentrant (Module *mod) _p11_lock (); debug ("C_Initialize: result: %lu", rv); + mod->initializing = 0; /* * Because we have the mutex unlocked above, two initializes could diff --git a/tests/Makefile.am b/tests/Makefile.am index 71e31a3..65828bf 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -16,20 +16,26 @@ noinst_PROGRAMS = \ conf-test \ uri-test \ pin-test \ + print-messages \ test-fork \ - print-messages + test-recursive test_fork_SOURCES = \ test-fork.c \ mock-module.c mock-module.h +test_recursive_SOURCES = \ + test-recursive.c \ + mock-module.c mock-module.h + check-am: ./hash-test ./ptr-array-test ./conf-test ./uri-test ./pin-test - ./p11-test + ./test-fork + ./test-recursive EXTRA_DIST = \ cutest \ diff --git a/tests/test-recursive.c b/tests/test-recursive.c new file mode 100644 index 0000000..97e692e --- /dev/null +++ b/tests/test-recursive.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2011, Collabora Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Stef Walter <stefw@collabora.co.uk> + */ + +#include "config.h" +#include "CuTest.h" + +#include <sys/types.h> +#include <sys/wait.h> + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "p11-kit/p11-kit.h" + +#include "mock-module.h" + +CK_FUNCTION_LIST module; + +static CK_RV +mock_C_Initialize__with_recursive (CK_VOID_PTR init_args) +{ + CK_RV rv; + + rv = mock_C_Initialize (init_args); + assert (rv == CKR_OK); + + /* Recursively initialize, this is broken */ + return p11_kit_initialize_module (&module); +} + +static void +test_recursive_initialization (CuTest *tc) +{ + CK_RV rv; + + /* Build up our own function list */ + memcpy (&module, &mock_module_no_slots, sizeof (CK_FUNCTION_LIST)); + module.C_Initialize = mock_C_Initialize__with_recursive; + + rv = p11_kit_initialize_module (&module); + CuAssertTrue (tc, rv == CKR_FUNCTION_FAILED); +} + +int +main (void) +{ + CuString *output = CuStringNew (); + CuSuite* suite = CuSuiteNew (); + int ret; + + SUITE_ADD_TEST (suite, test_recursive_initialization); + + CuSuiteRun (suite); + CuSuiteSummary (suite, output); + CuSuiteDetails (suite, output); + printf ("%s\n", output->buffer); + ret = suite->failCount; + CuSuiteDelete (suite); + CuStringDelete (output); + + return ret; +} + +#include "CuTest.c" |