summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--p11-kit/modules.c9
-rw-r--r--tests/Makefile.am10
-rw-r--r--tests/test-recursive.c98
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"