git: fb889ca82944 - main - devel/gettext-runtime: Fix crash triggered by libgpg-error

From: Tijl Coosemans <tijl_at_FreeBSD.org>
Date: Mon, 17 Jul 2023 18:55:52 UTC
The branch main has been updated by tijl:

URL: https://cgit.FreeBSD.org/ports/commit/?id=fb889ca82944e04d4b3dfa2a13c51456bbde0094

commit fb889ca82944e04d4b3dfa2a13c51456bbde0094
Author:     Tijl Coosemans <tijl@FreeBSD.org>
AuthorDate: 2023-07-17 13:06:02 +0000
Commit:     Tijl Coosemans <tijl@FreeBSD.org>
CommitDate: 2023-07-17 18:53:17 +0000

    devel/gettext-runtime: Fix crash triggered by libgpg-error
    
    Libgpg-error has an initialisation function with
    __attribute__((constructor)) that calls a libintl function that
    calls pthread_rwlock_wrlock that segfaults if libpthread wasn't
    initialised yet.  This can happen because libintl doesn't link to
    libpthread to avoid the overhead for non-threaded programs.  To
    fix this, add an initialisation function to libintl that triggers
    initialisation of libpthread.
    
    RTLD_NOLOAD suggested by kib.
    
    dlopen was fixed to work during initialisation in
    https://cgit.FreeBSD.org/src/commit/?id=1005d3d05362
    
    PR:             272472, 272517
---
 Mk/Uses/gettext-runtime.mk                     |  5 +++--
 devel/gettext-runtime/Makefile                 |  2 +-
 devel/gettext-runtime/files/patch-intl_osdep.c | 28 ++++++++++++++++++++++++++
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Mk/Uses/gettext-runtime.mk b/Mk/Uses/gettext-runtime.mk
index 374a19b45ec4..1d0f0b8900b9 100644
--- a/Mk/Uses/gettext-runtime.mk
+++ b/Mk/Uses/gettext-runtime.mk
@@ -14,13 +14,14 @@ gettext-runtime_ARGS=	lib
 .  endif
 
 .  if ${gettext-runtime_ARGS:Mlib}
+BUILD_DEPENDS+=	gettext-runtime>=0.22_1:devel/gettext-runtime
 LIB_DEPENDS+=	libintl.so:devel/gettext-runtime
 .  endif
 .  if ${gettext-runtime_ARGS:Mbuild}
-BUILD_DEPENDS+=	gettext:devel/gettext-runtime
+BUILD_DEPENDS+=	gettext-runtime>=0.22_1:devel/gettext-runtime
 .  endif
 .  if ${gettext-runtime_ARGS:Mrun}
-RUN_DEPENDS+=	gettext:devel/gettext-runtime
+RUN_DEPENDS+=	gettext-runtime>=0.22_1:devel/gettext-runtime
 .  endif
 
 .endif
diff --git a/devel/gettext-runtime/Makefile b/devel/gettext-runtime/Makefile
index 618340e867f9..1e57b4fb24d7 100644
--- a/devel/gettext-runtime/Makefile
+++ b/devel/gettext-runtime/Makefile
@@ -3,7 +3,7 @@
 # discretion.
 
 PORTNAME=	gettext-runtime
-PORTREVISION=	0
+PORTREVISION=	1
 
 COMMENT=	GNU gettext runtime libraries and programs
 WWW=		https://www.gnu.org/software/gettext/
diff --git a/devel/gettext-runtime/files/patch-intl_osdep.c b/devel/gettext-runtime/files/patch-intl_osdep.c
new file mode 100644
index 000000000000..1f1825303b65
--- /dev/null
+++ b/devel/gettext-runtime/files/patch-intl_osdep.c
@@ -0,0 +1,28 @@
+--- intl/osdep.c.orig	2019-05-11 11:29:32 UTC
++++ intl/osdep.c
+@@ -18,6 +18,25 @@
+ # include "intl-exports.c"
+ #elif defined __EMX__ && !defined __KLIBC__
+ # include "os2compat.c"
++#elif defined __FreeBSD__
++#include <config.h>
++#include <sys/param.h>
++#include <dlfcn.h>
++#include <pthread.h>
++static __attribute__((constructor)) void
++libintl_init (void)
++{
++#if __FreeBSD_version >= 1400094
++  /* We don't link with libpthread in order to avoid the overhead for
++     non-threaded programs.  Instead we dlopen it with RTLD_NOLOAD here
++     to ensure it is initialised when present.  */
++  (void) dlopen ("libpthread.so", RTLD_LAZY | RTLD_GLOBAL | RTLD_NOLOAD);
++#else
++  /* For older versions this hack also triggers libpthread
++     initialisation.  */
++  (void) pthread_self ();
++#endif
++}
+ #else
+ /* Avoid AIX compiler warning.  */
+ typedef int dummy;