aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTijl Coosemans <tijl@FreeBSD.org>2024-04-12 19:03:35 +0000
committerTijl Coosemans <tijl@FreeBSD.org>2024-04-12 20:20:49 +0000
commit5842d08c97cdecf1e3f8e2c536adb0aac3191574 (patch)
tree75d4355d63a3559a274584c064d66577d56a65d0
parentb4e267914c758b0559e1158e650f0dda6f3d9f51 (diff)
downloadports-5842d08c97cdecf1e3f8e2c536adb0aac3191574.tar.gz
ports-5842d08c97cdecf1e3f8e2c536adb0aac3191574.zip
security/gnutls: initialise libpthread
To ensure thread-safety libgnutls calls libpthread functions but to avoid the overhead for single-threaded programs it does not link with libpthread. It only calls libpthread if the executable or another library links to it. Since 3.8.0 libgnutls calls pthread_key_create from its init function but because it does not link with libpthread libpthread might not have been initialised yet. Patch the libgnutls init function so it initialises libpthread. PR: 278076 (cherry picked from commit 9ffc65e659a32a4eb293afd5c4d03be553a61570)
-rw-r--r--security/gnutls/Makefile1
-rw-r--r--security/gnutls/files/patch-lib_global.c43
2 files changed, 44 insertions, 0 deletions
diff --git a/security/gnutls/Makefile b/security/gnutls/Makefile
index f72a03894fb0..d7d190bce6f5 100644
--- a/security/gnutls/Makefile
+++ b/security/gnutls/Makefile
@@ -1,5 +1,6 @@
PORTNAME= gnutls
DISTVERSION= 3.8.5
+PORTREVISION= 1
CATEGORIES= security net
MASTER_SITES= GNUPG/${PORTNAME}/v${DISTVERSION:R}
diff --git a/security/gnutls/files/patch-lib_global.c b/security/gnutls/files/patch-lib_global.c
new file mode 100644
index 000000000000..967aa49a5877
--- /dev/null
+++ b/security/gnutls/files/patch-lib_global.c
@@ -0,0 +1,43 @@
+--- lib/global.c.orig 2024-04-11 15:36:24 UTC
++++ lib/global.c
+@@ -29,6 +29,13 @@
+ #include "random.h"
+ #include <gnutls/pkcs11.h>
+
++#if __FreeBSD__
++#include <sys/param.h>
++#if __FreeBSD_version >= 1400094
++#include <dlfcn.h>
++#endif
++#endif
++
+ #include "hello_ext.h" /* for _gnutls_hello_ext_init */
+ #include "supplemental.h" /* for _gnutls_supplemental_deinit */
+ #include "locks.h"
+@@ -520,6 +527,26 @@ static void _CONSTRUCTOR lib_init(void)
+ if (ret == 1)
+ return;
+ }
++
++#if __FreeBSD__
++#if __FreeBSD_version >= 1400094
++ /* This dlopen call initialises libpthread if it is present. Normally
++ this is handled by linking to libpthread but libgnutls does not link
++ with libpthread to avoid the overhead for non-threaded programs. */
++ (void) dlopen("libpthread.so", RTLD_LAZY | RTLD_GLOBAL | RTLD_NOLOAD);
++#else
++ /* The dlopen call above does not work correctly on older versions of
++ FreeBSD. Call pthread_mutex_timedlock instead. It initialises
++ libpthread and there's no libc stub that can preempt it. */
++#pragma weak pthread_mutex_timedlock
++ if (pthread_mutex_timedlock != NULL) {
++ pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
++ pthread_mutex_timedlock(&lock, NULL);
++ pthread_mutex_unlock(&lock);
++ pthread_mutex_destroy(&lock);
++ }
++#endif
++#endif
+
+ ret = _gnutls_global_init(1);
+ if (ret < 0) {