From aa834639345f691a51aaf3210d02980f85bc73e3 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Fri, 20 Mar 2026 12:03:34 -0400 Subject: [PATCH 1/2] ext/fileinfo/libmagic/file.h: hide "file_public" names by default When libphp.so (from the embed SAPI, or the apache module) is loaded by another project that already uses libmagic, the symbols from the two copies of libmagic... $ objdump -TC ./libs/libphp.so | grep '\smagic_' 00000000002b2754 g DF .text 0000000000000034 Base magic_compile 00000000002b25fe g DF .text 0000000000000024 Base magic_open 00000000002b27f0 g DF .text 0000000000000034 Base magic_descriptor 00000000002b2720 g DF .text 0000000000000034 Base magic_load 00000000002b2c1a g DF .text 0000000000000032 Base magic_setflags 00000000002b27bc g DF .text 0000000000000034 Base magic_list 00000000002b2c62 g DF .text 0000000000000206 Base magic_setparam 00000000002b2bf4 g DF .text 0000000000000026 Base magic_getflags 00000000002b2bbe g DF .text 0000000000000036 Base magic_errno 00000000002b2e68 g DF .text 00000000000001f4 Base magic_getparam 00000000002b2b14 g DF .text 000000000000006e Base magic_buffer 00000000002b2b82 g DF .text 000000000000003c Base magic_error 00000000002b2788 g DF .text 0000000000000034 Base magic_check 00000000002b2c4c g DF .text 0000000000000016 Base magic_version 00000000002b26fa g DF .text 0000000000000026 Base magic_close 00000000002b2858 g DF .text 0000000000000034 Base magic_stream 00000000002b2824 g DF .text 0000000000000034 Base magic_file can clash. To see this, we (pointlessly) link libphp.so from the embed SAPI into a small program using the system copy of libmagic: $ gcc $(/usr/lib/php8.5/bin/php-config --includes) main.c \ -L/usr/lib/php8.5/lib -lphp -lmagic $ LD_LIBRARY_PATH=/usr/lib/php8.5/lib ./a.out Segmentation fault LD_LIBRARY_PATH=/usr/lib/php8.5/lib ./a.out To avoid this, we modify the internal "file_public" macro used by libmagic, so that (on platforms that support it) hidden visibility is used instead of the default. Afterwards the objdump command above produces no output, and the test program no longer sefaults. Co-authored-by: Ilija Tovilo PHP-bug: https://bugs.php.net/bug.php?id=66095 Gentoo-bug: https://bugs.gentoo.org/471682 --- ext/fileinfo/libmagic/file.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h index 718a60b2e1b00..5357578c6a775 100644 --- a/ext/fileinfo/libmagic/file.h +++ b/ext/fileinfo/libmagic/file.h @@ -102,12 +102,12 @@ #if HAVE_VISIBILITY # if defined(WIN32) -# define file_public __declspec(dllexport) +# define file_public # ifndef file_protected # define file_protected # endif # else -# define file_public __attribute__((__visibility__("default"))) +# define file_public __attribute__((__visibility__("hidden"))) # ifndef file_protected # define file_protected __attribute__((__visibility__("hidden"))) # endif From a1113752c04d83365af2201eee012715bdc3815e Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Wed, 25 Mar 2026 16:15:02 -0400 Subject: [PATCH 2/2] ext/fileinfo/libmagic.patch: update Run ext/fileinfo/generate_patch.sh to regenerate our libmagic patch after a recent commit that changes the default symbol visibility in libmagic/file.h to "hidden". --- ext/fileinfo/libmagic.patch | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index 6e3751fa943f8..0f69e732fdd5d 100644 --- a/ext/fileinfo/libmagic.patch +++ b/ext/fileinfo/libmagic.patch @@ -1727,7 +1727,7 @@ diff -u libmagic.orig/encoding.c libmagic/encoding.c } diff -u libmagic.orig/file.h libmagic/file.h --- libmagic.orig/file.h 2024-11-27 10:37:00.000000000 -0500 -+++ libmagic/file.h 2026-03-25 08:13:23.336328498 -0400 ++++ libmagic/file.h 2026-03-25 16:14:40.128668705 -0400 @@ -27,15 +27,13 @@ */ /* @@ -1767,6 +1767,21 @@ diff -u libmagic.orig/file.h libmagic/file.h #define ENABLE_CONDITIONALS +@@ -109,12 +102,12 @@ + + #if HAVE_VISIBILITY + # if defined(WIN32) +-# define file_public __declspec(dllexport) ++# define file_public + # ifndef file_protected + # define file_protected + # endif + # else +-# define file_public __attribute__((__visibility__("default"))) ++# define file_public __attribute__((__visibility__("hidden"))) + # ifndef file_protected + # define file_protected __attribute__((__visibility__("hidden"))) + # endif @@ -179,7 +172,7 @@ #define MAXstring 128 /* max len of "string" types */ @@ -3075,7 +3090,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c } return file_getbuffer(ms); diff -u libmagic.orig/magic.h libmagic/magic.h ---- libmagic.orig/magic.h 2026-03-25 08:16:04.280413419 -0400 +--- libmagic.orig/magic.h 2026-03-25 16:14:49.284673536 -0400 +++ libmagic/magic.h 2026-03-20 12:10:19.777614667 -0400 @@ -47,8 +47,6 @@ * extensions */