]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[v9_11] Merged rt43076 (log PKCS#11 provider load failure)
authorEvan Hunt <each@isc.org>
Mon, 22 Aug 2016 16:07:45 +0000 (09:07 -0700)
committerEvan Hunt <each@isc.org>
Mon, 22 Aug 2016 16:07:45 +0000 (09:07 -0700)
(cherry picked from commit 2f08617da9a3d8dc59dbf802d7a0bca4028892cb)

lib/isc/include/pk11/pk11.h
lib/isc/pk11.c
lib/isc/unix/pk11_api.c
lib/isc/win32/libisc.def.in
lib/isc/win32/pk11_api.c

index 2164d174f25a7be681c3f74caacb86bd9706c2ab..b0d587ec9880a9bcb4e2847125200a02bcf19566 100644 (file)
@@ -150,6 +150,8 @@ void pk11_dump_tokens(void);
 CK_RV
 pkcs_C_Initialize(CK_VOID_PTR pReserved);
 
+char *pk11_get_load_error_message(void);
+
 CK_RV
 pkcs_C_Finalize(CK_VOID_PTR pReserved);
 
index f8e89ab3570cbe34dd12eb80331f990d4a697f14..0296da73f3e6923b6e2d5fd234109ad87fa6835c 100644 (file)
@@ -206,6 +206,8 @@ pk11_initialize(isc_mem_t *mctx, const char *engine) {
 
        if (rv == 0xfe) {
                result = PK11_R_NOPROVIDER;
+               fprintf(stderr, "Can't load PKCS#11 provider: %s\n",
+                       pk11_get_load_error_message());
                goto unlock;
        }
        if (rv != CKR_OK) {
index 9c0e372fdc6fd0d9daa5c9a9ccd29743cc3aa149..a93108642db2c8f1dedcc97d138eb3ea79061f93 100644 (file)
@@ -30,6 +30,7 @@
 #include <pk11/internal.h>
 
 static void *hPK11 = NULL;
+static char loaderrmsg[1024];
 
 CK_RV
 pkcs_C_Initialize(CK_VOID_PTR pReserved) {
@@ -40,14 +41,22 @@ pkcs_C_Initialize(CK_VOID_PTR pReserved) {
 
        hPK11 = dlopen(pk11_get_lib_name(), RTLD_NOW);
 
-       if (hPK11 == NULL)
+       if (hPK11 == NULL) {
+               snprintf(loaderrmsg, sizeof(loaderrmsg),
+                        "dlopen(\"%s\") failed: %s\n",
+                        pk11_get_lib_name(), dlerror());
                return (CKR_LIBRARY_FAILED_TO_LOAD);
+       }
        sym = (CK_C_Initialize)dlsym(hPK11, "C_Initialize");
        if (sym == NULL)
                return (CKR_SYMBOL_RESOLUTION_FAILED);
        return (*sym)(pReserved);
 }
 
+char *pk11_get_load_error_message(void) {
+       return (loaderrmsg);
+}
+
 CK_RV
 pkcs_C_Finalize(CK_VOID_PTR pReserved) {
        CK_C_Finalize sym;
@@ -131,8 +140,12 @@ pkcs_C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags,
 
        if (hPK11 == NULL)
                hPK11 = dlopen(pk11_get_lib_name(), RTLD_NOW);
-       if (hPK11 == NULL)
+       if (hPK11 == NULL) {
+               snprintf(loaderrmsg, sizeof(loaderrmsg),
+                        "dlopen(\"%s\") failed: %s\n",
+                        pk11_get_lib_name(), dlerror());
                return (CKR_LIBRARY_FAILED_TO_LOAD);
+       }
        if ((sym == NULL) || (hPK11 != pPK11)) {
                pPK11 = hPK11;
                sym = (CK_C_OpenSession)dlsym(hPK11, "C_OpenSession");
index 115ce106be55a41203bc8a6bcf194172dbb25d04..332f247a61baf8e4d7c41d021ade16499ac6b033 100644 (file)
@@ -747,6 +747,7 @@ pk11_error_fatalcheck
 pk11_finalize
 pk11_get_best_token
 pk11_get_lib_name
+pk11_get_load_error_message
 pk11_get_session
 pk11_initialize
 pk11_initmsgcat
index 13026732f2e1d9d44d2d48a3f22bcd05290864f3..a69021fdaf552f0aa874bd3c2a21eb0d12a2f81b 100644 (file)
@@ -63,6 +63,7 @@ getpassphrase(const char *prompt) {
 /* load PKCS11 DLL */
 
 static HINSTANCE hPK11 = NULL;
+static char loaderrmsg[1024];
 
 CK_RV
 pkcs_C_Initialize(CK_VOID_PTR pReserved) {
@@ -80,14 +81,23 @@ pkcs_C_Initialize(CK_VOID_PTR pReserved) {
 
        hPK11 = LoadLibraryA(lib_name);
 
-       if (hPK11 == NULL)
+       if (hPK11 == NULL) {
+               const DWORD err = GetLastError();
+               snprintf(loaderrmsg, sizeof(loaderrmsg),
+                        "LoadLibraryA(\"%s\") failed with 0x%X\n",
+                        lib_name, err);
                return (CKR_LIBRARY_FAILED_TO_LOAD);
+       }
        sym = (CK_C_Initialize)GetProcAddress(hPK11, "C_Initialize");
        if (sym == NULL)
                return (CKR_SYMBOL_RESOLUTION_FAILED);
        return (*sym)(pReserved);
 }
 
+char *pk11_get_load_error_message(void) {
+       return (loaderrmsg);
+}
+
 CK_RV
 pkcs_C_Finalize(CK_VOID_PTR pReserved) {
        CK_C_Finalize sym;
@@ -167,8 +177,13 @@ pkcs_C_OpenSession(CK_SLOT_ID slotID,
 
        if (hPK11 == NULL)
                hPK11 = LoadLibraryA(pk11_get_lib_name());
-       if (hPK11 == NULL)
+       if (hPK11 == NULL) {
+               const DWORD err = GetLastError();
+               snprintf(loaderrmsg, sizeof(loaderrmsg),
+                        "LoadLibraryA(\"%s\") failed with 0x%X\n",
+                        pk11_get_lib_name(), err);
                return (CKR_LIBRARY_FAILED_TO_LOAD);
+       }
        if (sym == NULL)
                sym = (CK_C_OpenSession)GetProcAddress(hPK11, "C_OpenSession");
        if (sym == NULL)