Skip to content

Commit 0401fb3

Browse files
orlitzkyiluuu1994
authored andcommitted
[fileinfo] Hide libmagic dynamic symbols
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 <ilija.tovilo@me.com> PHP-bug: https://bugs.php.net/bug.php?id=66095 Gentoo-bug: https://bugs.gentoo.org/471682 Fixes #66095 Closes GH-21472
1 parent e4b3ffe commit 0401fb3

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

NEWS

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ PHP NEWS
3030
- Fileinfo:
3131
. Fixed bug GH-20679 (finfo_file() doesn't work on remote resources).
3232
(ndossche)
33+
. Fixed bug #66095 (Hide libmagic dynamic symbols). (orlitzky)
3334

3435
- Hash:
3536
. Upgrade xxHash to 0.8.2. (timwolla)
@@ -51,7 +52,7 @@ PHP NEWS
5152
small value). (David Carlier)
5253

5354
- Mail:
54-
. Fixed bug GH-20862 (null pointer dereference in
55+
. Fixed bug GH-20862 (null pointer dereference in
5556
php_mail_detect_multiple_crlf via error_log (jordikroon)
5657

5758
- Mbstring:

ext/fileinfo/libmagic.patch

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,7 +1727,7 @@ diff -u libmagic.orig/encoding.c libmagic/encoding.c
17271727
}
17281728
diff -u libmagic.orig/file.h libmagic/file.h
17291729
--- libmagic.orig/file.h 2024-11-27 10:37:00.000000000 -0500
1730-
+++ libmagic/file.h 2026-03-25 08:13:23.336328498 -0400
1730+
+++ libmagic/file.h 2026-03-25 16:14:40.128668705 -0400
17311731
@@ -27,15 +27,13 @@
17321732
*/
17331733
/*
@@ -1767,6 +1767,21 @@ diff -u libmagic.orig/file.h libmagic/file.h
17671767

17681768
#define ENABLE_CONDITIONALS
17691769

1770+
@@ -109,12 +102,12 @@
1771+
1772+
#if HAVE_VISIBILITY
1773+
# if defined(WIN32)
1774+
-# define file_public __declspec(dllexport)
1775+
+# define file_public
1776+
# ifndef file_protected
1777+
# define file_protected
1778+
# endif
1779+
# else
1780+
-# define file_public __attribute__((__visibility__("default")))
1781+
+# define file_public __attribute__((__visibility__("hidden")))
1782+
# ifndef file_protected
1783+
# define file_protected __attribute__((__visibility__("hidden")))
1784+
# endif
17701785
@@ -179,7 +172,7 @@
17711786
#define MAXstring 128 /* max len of "string" types */
17721787

@@ -3075,7 +3090,7 @@ diff -u libmagic.orig/magic.c libmagic/magic.c
30753090
}
30763091
return file_getbuffer(ms);
30773092
diff -u libmagic.orig/magic.h libmagic/magic.h
3078-
--- libmagic.orig/magic.h 2026-03-25 08:16:04.280413419 -0400
3093+
--- libmagic.orig/magic.h 2026-03-25 16:14:49.284673536 -0400
30793094
+++ libmagic/magic.h 2026-03-20 12:10:19.777614667 -0400
30803095
@@ -47,8 +47,6 @@
30813096
* extensions */

ext/fileinfo/libmagic/file.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,12 @@
102102

103103
#if HAVE_VISIBILITY
104104
# if defined(WIN32)
105-
# define file_public __declspec(dllexport)
105+
# define file_public
106106
# ifndef file_protected
107107
# define file_protected
108108
# endif
109109
# else
110-
# define file_public __attribute__((__visibility__("default")))
110+
# define file_public __attribute__((__visibility__("hidden")))
111111
# ifndef file_protected
112112
# define file_protected __attribute__((__visibility__("hidden")))
113113
# endif

0 commit comments

Comments
 (0)