Browse code

vcpkg-ports/pkcs11-helper: support loader flags

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)

Marc Becker authored on 2022/12/14 23:33:25
Showing 2 changed files
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) {
... ...
@@ -14,6 +14,7 @@ vcpkg_extract_source_archive_ex(
14 14
         0001-nmake-compatibility-with-vcpkg-nmake.patch
15 15
         0002-config-w32-vc.h.in-indicate-OpenSSL.patch
16 16
         pkcs11-helper-001-RFC7512.patch
17
+        pkcs11-helper-002-dynamic_loader_flags.patch
17 18
 )
18 19
 
19 20
 vcpkg_build_nmake(