summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-03-28 17:54:39 +0100
committerStef Walter <stefw@gnome.org>2013-03-28 17:54:39 +0100
commit4560373c254473990306c13178b959ccc5d338e4 (patch)
treed4e2d863ad87984b9ee62849651878b1f3fec7bc
parent10d8e6d1836701e311d2b55e116909198932915b (diff)
downloadp11-kit-4560373c254473990306c13178b959ccc5d338e4.tar.gz
Don't complain when applications call C_Logout or C_Login
Some callers erroneously call our C_Logout function, like NSS. So return appropriate error codes in these cases. https://bugs.freedesktop.org/show_bug.cgi?id=62874
-rw-r--r--trust/module.c32
-rw-r--r--trust/tests/test-module.c23
2 files changed, 53 insertions, 2 deletions
diff --git a/trust/module.c b/trust/module.c
index 6be2847..51a75e0 100644
--- a/trust/module.c
+++ b/trust/module.c
@@ -855,13 +855,41 @@ sys_C_Login (CK_SESSION_HANDLE handle,
CK_UTF8CHAR_PTR pin,
CK_ULONG pin_len)
{
- return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
+ CK_RV rv;
+
+ p11_debug ("in");
+
+ p11_lock ();
+
+ rv = lookup_session (handle, NULL);
+ if (rv == CKR_OK)
+ rv = CKR_USER_TYPE_INVALID;
+
+ p11_unlock ();
+
+ p11_debug ("out: 0x%lx", rv);
+
+ return rv;
}
static CK_RV
sys_C_Logout (CK_SESSION_HANDLE handle)
{
- return_val_if_reached (CKR_FUNCTION_NOT_SUPPORTED);
+ CK_RV rv;
+
+ p11_debug ("in");
+
+ p11_lock ();
+
+ rv = lookup_session (handle, NULL);
+ if (rv == CKR_OK)
+ rv = CKR_USER_NOT_LOGGED_IN;
+
+ p11_unlock ();
+
+ p11_debug ("out: 0x%lx", rv);
+
+ return rv;
}
static CK_RV
diff --git a/trust/tests/test-module.c b/trust/tests/test-module.c
index 1033b05..c92e1c3 100644
--- a/trust/tests/test-module.c
+++ b/trust/tests/test-module.c
@@ -867,6 +867,28 @@ test_find_serial_der_decoded (CuTest *cu)
teardown (cu);
}
+static void
+test_login_logout (CuTest *cu)
+{
+ CK_SESSION_HANDLE session;
+ CK_RV rv;
+
+ setup (cu);
+
+ rv = test.module->C_OpenSession (test.slots[0], CKF_SERIAL_SESSION, NULL, NULL, &session);
+ CuAssertTrue (cu, rv == CKR_OK);
+
+ /* Just testing our stubs for now */
+
+ rv = test.module->C_Login (session, CKU_USER, NULL, 0);
+ CuAssertTrue (cu, rv == CKR_USER_TYPE_INVALID);
+
+ rv = test.module->C_Logout (session);
+ CuAssertTrue (cu, rv == CKR_USER_NOT_LOGGED_IN);
+
+ teardown (cu);
+}
+
int
main (void)
{
@@ -894,6 +916,7 @@ main (void)
SUITE_ADD_TEST (suite, test_session_remove);
SUITE_ADD_TEST (suite, test_session_setattr);
SUITE_ADD_TEST (suite, test_find_serial_der_decoded);
+ SUITE_ADD_TEST (suite, test_login_logout);
CuSuiteRun (suite);
CuSuiteSummary (suite, output);