Add dynamic loader flag feature to bundled pkcs11-helper.
Required to allow special handling for PKCS11 providers on win32.
Signed-off-by: Marc Becker <marc.becker@astos.de>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <20221214143325.2604-1-marc.becker@astos.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25691.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit 2f9c56e2cb0ce0f8d7a2a30f89831d1ddc0f2bbb)
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,102 @@ |
| 0 |
+From 934197611dd1260d17ae0f11ae81c1d2e85612d2 Mon Sep 17 00:00:00 2001 |
|
| 1 |
+From: Marc Becker <marc.becker@astos.de> |
|
| 2 |
+Date: Fri, 22 Jul 2022 10:33:05 +0200 |
|
| 3 |
+Subject: [PATCH] core: add provider property for loader flags |
|
| 4 |
+ |
|
| 5 |
+support flags for dynamic loader via provider property |
|
| 6 |
+set original values as defaults, use verbatim (user-supplied) value |
|
| 7 |
+--- |
|
| 8 |
+ include/pkcs11-helper-1.0/pkcs11h-core.h | 11 ++++++++++- |
|
| 9 |
+ lib/_pkcs11h-core.h | 2 ++ |
|
| 10 |
+ lib/pkcs11h-core.c | 13 +++++++++++-- |
|
| 11 |
+ 3 files changed, 23 insertions(+), 3 deletions(-) |
|
| 12 |
+ |
|
| 13 |
+diff --git a/include/pkcs11-helper-1.0/pkcs11h-core.h b/include/pkcs11-helper-1.0/pkcs11h-core.h |
|
| 14 |
+index 9028c277..56f87718 100644 |
|
| 15 |
+--- a/include/pkcs11-helper-1.0/pkcs11h-core.h |
|
| 16 |
+@@ -384,8 +384,17 @@ extern "C" {
|
|
| 17 |
+ */ |
|
| 18 |
+ #define PKCS11H_PROVIDER_PROPERTY_PROVIDER_DESTRUCT_HOOK_DATA 8 |
|
| 19 |
+ |
|
| 20 |
++/** |
|
| 21 |
++ * @brief Provider loader flags for platform. |
|
| 22 |
++ * Value type is unsigned. |
|
| 23 |
++ * Default value is platform dependent: |
|
| 24 |
++ * win32 -> 0 |
|
| 25 |
++ * dlopen -> RTLD_NOW | RTLD_LOCAL |
|
| 26 |
++ */ |
|
| 27 |
++#define PKCS11H_PROVIDER_PROPERTY_LOADER_FLAGS 9 |
|
| 28 |
++ |
|
| 29 |
+ /** @private */ |
|
| 30 |
+-#define _PKCS11H_PROVIDER_PROPERTY_LAST 9 |
|
| 31 |
++#define _PKCS11H_PROVIDER_PROPERTY_LAST 10 |
|
| 32 |
+ |
|
| 33 |
+ /** @} */ |
|
| 34 |
+ |
|
| 35 |
+diff --git a/lib/_pkcs11h-core.h b/lib/_pkcs11h-core.h |
|
| 36 |
+index f879c0e8..1c02e35d 100644 |
|
| 37 |
+--- a/lib/_pkcs11h-core.h |
|
| 38 |
+@@ -134,6 +134,8 @@ struct _pkcs11h_provider_s {
|
|
| 39 |
+ #if defined(ENABLE_PKCS11H_SLOTEVENT) |
|
| 40 |
+ _pkcs11h_thread_t slotevent_thread; |
|
| 41 |
+ #endif |
|
| 42 |
++ |
|
| 43 |
++ unsigned loader_flags; |
|
| 44 |
+ }; |
|
| 45 |
+ |
|
| 46 |
+ struct _pkcs11h_session_s {
|
|
| 47 |
+diff --git a/lib/pkcs11h-core.c b/lib/pkcs11h-core.c |
|
| 48 |
+index 0bf11e87..409ad9e2 100644 |
|
| 49 |
+--- a/lib/pkcs11h-core.c |
|
| 50 |
+@@ -138,6 +138,7 @@ static const char * __pkcs11h_provider_preperty_names[] = {
|
|
| 51 |
+ "init_args", |
|
| 52 |
+ "provider_destruct_hook", |
|
| 53 |
+ "provider_destruct_hook_data", |
|
| 54 |
++ "provider_loader_flags", |
|
| 55 |
+ NULL |
|
| 56 |
+ }; |
|
| 57 |
+ |
|
| 58 |
+@@ -916,6 +917,10 @@ pkcs11h_registerProvider ( |
|
| 59 |
+ reference |
|
| 60 |
+ ); |
|
| 61 |
+ |
|
| 62 |
++#if !defined(_WIN32) |
|
| 63 |
++ provider->loader_flags = RTLD_NOW | RTLD_LOCAL; |
|
| 64 |
++#endif |
|
| 65 |
++ |
|
| 66 |
+ _PKCS11H_DEBUG ( |
|
| 67 |
+ PKCS11H_LOG_DEBUG2, |
|
| 68 |
+ "PKCS#11: pkcs11h_registerProvider Provider '%s'", |
|
| 69 |
+@@ -1001,6 +1006,7 @@ pkcs11h_setProviderPropertyByName ( |
|
| 70 |
+ case PKCS11H_PROVIDER_PROPERTY_SLOT_EVENT_METHOD: |
|
| 71 |
+ case PKCS11H_PROVIDER_PROPERTY_MASK_PRIVATE_MODE: |
|
| 72 |
+ case PKCS11H_PROVIDER_PROPERTY_SLOT_POLL_INTERVAL: |
|
| 73 |
++ case PKCS11H_PROVIDER_PROPERTY_LOADER_FLAGS: |
|
| 74 |
+ *(unsigned *)value = (unsigned)strtol(value_str, 0, 0); |
|
| 75 |
+ value_size = sizeof(unsigned); |
|
| 76 |
+ break; |
|
| 77 |
+@@ -1084,6 +1090,9 @@ __pkcs11h_providerPropertyAddress( |
|
| 78 |
+ case PKCS11H_PROVIDER_PROPERTY_PROVIDER_DESTRUCT_HOOK_DATA: |
|
| 79 |
+ *value = &provider->destruct_hook_data; |
|
| 80 |
+ *value_size = sizeof(provider->destruct_hook_data); |
|
| 81 |
++ case PKCS11H_PROVIDER_PROPERTY_LOADER_FLAGS: |
|
| 82 |
++ *value = &provider->loader_flags; |
|
| 83 |
++ *value_size = sizeof(provider->loader_flags); |
|
| 84 |
+ break; |
|
| 85 |
+ } |
|
| 86 |
+ rv = CKR_OK; |
|
| 87 |
+@@ -1254,9 +1263,9 @@ pkcs11h_initializeProvider ( |
|
| 88 |
+ } |
|
| 89 |
+ |
|
| 90 |
+ #if defined(_WIN32) |
|
| 91 |
+- provider->handle = LoadLibraryA (provider->provider_location); |
|
| 92 |
++ provider->handle = LoadLibraryExA (provider->provider_location, NULL, provider->loader_flags); |
|
| 93 |
+ #else |
|
| 94 |
+- provider->handle = dlopen (provider->provider_location, RTLD_NOW | RTLD_LOCAL); |
|
| 95 |
++ provider->handle = dlopen (provider->provider_location, provider->loader_flags); |
|
| 96 |
+ #endif |
|
| 97 |
+ |
|
| 98 |
+ if (provider->handle == NULL) {
|