Skip to content

Commit 39f95f5

Browse files
committed
Fix #77961: finfo_open crafted magic parsing SIGABRT
libmagic may abort the running process, which is not desirable for PHP; we raise a fatal error instead. Closes GH-6437.
1 parent 5f9c82d commit 39f95f5

File tree

5 files changed

+107
-31
lines changed

5 files changed

+107
-31
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ PHP NEWS
1111
. Fixed bug #80362 (Running dtrace scripts can cause php to crash).
1212
(al at coralnet dot name)
1313

14+
- Fileinfo:
15+
. Fixed bug #77961 (finfo_open crafted magic parsing SIGABRT). (cmb)
16+
1417
- Standard:
1518
. Fixed bug #80366 (Return Value of zend_fstat() not Checked). (sagpant, cmb)
1619

ext/fileinfo/libmagic.patch

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
diff -u libmagic.orig/apprentice.c libmagic/apprentice.c
22
--- libmagic.orig/apprentice.c 2019-02-20 03:35:27.000000000 +0100
3-
+++ libmagic/apprentice.c 2020-02-27 11:45:38.445854000 +0100
3+
+++ libmagic/apprentice.c 2020-11-19 11:50:32.412674100 +0100
44
@@ -29,6 +29,8 @@
55
* apprentice - make one pass through /etc/magic, learning its secrets.
66
*/
@@ -974,7 +974,7 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c
974974
}
975975
diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c
976976
--- libmagic.orig/ascmagic.c 2019-05-07 04:27:11.000000000 +0200
977-
+++ libmagic/ascmagic.c 2020-02-26 23:18:22.605400700 +0100
977+
+++ libmagic/ascmagic.c 2020-09-07 00:42:14.447562400 +0200
978978
@@ -96,7 +96,7 @@
979979
rv = file_ascmagic_with_encoding(ms, &bb,
980980
ubuf, ulen, code, type, text);
@@ -1005,7 +1005,7 @@ diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c
10051005
}
10061006
diff -u libmagic.orig/buffer.c libmagic/buffer.c
10071007
--- libmagic.orig/buffer.c 2019-05-07 04:27:11.000000000 +0200
1008-
+++ libmagic/buffer.c 2020-02-27 11:45:38.445854000 +0100
1008+
+++ libmagic/buffer.c 2020-09-07 00:42:14.447562400 +0200
10091009
@@ -31,19 +31,23 @@
10101010
#endif /* lint */
10111011

@@ -1062,7 +1062,7 @@ diff -u libmagic.orig/buffer.c libmagic/buffer.c
10621062

10631063
diff -u libmagic.orig/cdf.c libmagic/cdf.c
10641064
--- libmagic.orig/cdf.c 2019-02-20 03:35:27.000000000 +0100
1065-
+++ libmagic/cdf.c 2020-02-27 11:45:38.445854000 +0100
1065+
+++ libmagic/cdf.c 2020-09-07 00:42:14.447562400 +0200
10661066
@@ -43,7 +43,17 @@
10671067
#include <err.h>
10681068
#endif
@@ -1341,7 +1341,7 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c
13411341
#endif
13421342
diff -u libmagic.orig/cdf.h libmagic/cdf.h
13431343
--- libmagic.orig/cdf.h 2019-02-20 02:24:19.000000000 +0100
1344-
+++ libmagic/cdf.h 2020-02-27 11:45:38.445854000 +0100
1344+
+++ libmagic/cdf.h 2020-09-07 00:42:14.447562400 +0200
13451345
@@ -35,10 +35,10 @@
13461346
#ifndef _H_CDF_
13471347
#define _H_CDF_
@@ -1366,7 +1366,7 @@ diff -u libmagic.orig/cdf.h libmagic/cdf.h
13661366
#define CDF_SECID_FREE -1
13671367
diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c
13681368
--- libmagic.orig/cdf_time.c 2019-03-12 21:43:05.000000000 +0100
1369-
+++ libmagic/cdf_time.c 2020-02-26 23:18:22.611402900 +0100
1369+
+++ libmagic/cdf_time.c 2020-09-07 00:42:14.447562400 +0200
13701370
@@ -23,6 +23,7 @@
13711371
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
13721372
* POSSIBILITY OF SUCH DAMAGE.
@@ -1395,7 +1395,7 @@ diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c
13951395
(void)snprintf(buf, 26, "*Bad* %#16.16" INT64_T_FORMAT "x\n",
13961396
diff -u libmagic.orig/compress.c libmagic/compress.c
13971397
--- libmagic.orig/compress.c 2019-05-07 04:27:11.000000000 +0200
1398-
+++ libmagic/compress.c 2020-02-27 11:45:38.445854000 +0100
1398+
+++ libmagic/compress.c 2020-09-07 00:42:14.447562400 +0200
13991399
@@ -45,13 +45,11 @@
14001400
#endif
14011401
#include <string.h>
@@ -1545,7 +1545,7 @@ diff -u libmagic.orig/compress.c libmagic/compress.c
15451545
+#endif
15461546
diff -u libmagic.orig/der.c libmagic/der.c
15471547
--- libmagic.orig/der.c 2019-02-20 03:35:27.000000000 +0100
1548-
+++ libmagic/der.c 2020-02-27 11:45:38.445854000 +0100
1548+
+++ libmagic/der.c 2020-09-07 00:42:14.447562400 +0200
15491549
@@ -51,7 +51,9 @@
15501550
#include "magic.h"
15511551
#include "der.h"
@@ -1575,7 +1575,7 @@ diff -u libmagic.orig/der.c libmagic/der.c
15751575
snprintf(buf + z, blen - z, "%.2x", d[i]);
15761576
diff -u libmagic.orig/elfclass.h libmagic/elfclass.h
15771577
--- libmagic.orig/elfclass.h 2019-02-20 02:30:19.000000000 +0100
1578-
+++ libmagic/elfclass.h 2020-02-26 23:18:22.613401700 +0100
1578+
+++ libmagic/elfclass.h 2020-09-07 00:42:14.447562400 +0200
15791579
@@ -41,7 +41,7 @@
15801580
return toomany(ms, "program headers", phnum);
15811581
flags |= FLAGS_IS_CORE;
@@ -1605,7 +1605,7 @@ diff -u libmagic.orig/elfclass.h libmagic/elfclass.h
16051605
CAST(int, elf_getu16(swap, elfhdr.e_shstrndx)),
16061606
diff -u libmagic.orig/encoding.c libmagic/encoding.c
16071607
--- libmagic.orig/encoding.c 2019-04-15 18:48:41.000000000 +0200
1608-
+++ libmagic/encoding.c 2020-02-26 23:18:22.614402300 +0100
1608+
+++ libmagic/encoding.c 2020-09-07 00:42:14.447562400 +0200
16091609
@@ -89,13 +89,13 @@
16101610
*code_mime = "binary";
16111611

@@ -1636,7 +1636,7 @@ diff -u libmagic.orig/encoding.c libmagic/encoding.c
16361636
}
16371637
diff -u libmagic.orig/file.h libmagic/file.h
16381638
--- libmagic.orig/file.h 2019-05-07 04:27:11.000000000 +0200
1639-
+++ libmagic/file.h 2020-02-27 11:45:38.445854000 +0100
1639+
+++ libmagic/file.h 2020-11-23 17:11:36.234964700 +0100
16401640
@@ -33,18 +33,9 @@
16411641
#ifndef __file_h__
16421642
#define __file_h__
@@ -1658,7 +1658,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
16581658
#ifdef _WIN64
16591659
#define SIZE_T_FORMAT "I64"
16601660
#else
1661-
@@ -57,19 +48,34 @@
1661+
@@ -57,32 +48,49 @@
16621662
#define INT64_T_FORMAT "ll"
16631663
#define INTMAX_T_FORMAT "j"
16641664
#endif
@@ -1698,7 +1698,14 @@ diff -u libmagic.orig/file.h libmagic/file.h
16981698
#include <sys/param.h>
16991699
#endif
17001700
/* Do this here and now, because struct stat gets re-defined on solaris */
1701-
@@ -82,7 +88,7 @@
1701+
#include <sys/stat.h>
1702+
#include <stdarg.h>
1703+
1704+
+#define abort() zend_error_noreturn(E_ERROR, "fatal libmagic error")
1705+
+
1706+
#define ENABLE_CONDITIONALS
1707+
1708+
#ifndef MAGIC
17021709
#define MAGIC "/etc/magic"
17031710
#endif
17041711

@@ -1707,7 +1714,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17071714
#define PATHSEP ';'
17081715
#else
17091716
#define PATHSEP ':'
1710-
@@ -116,12 +122,6 @@
1717+
@@ -116,12 +124,6 @@
17111718
#endif
17121719
#endif
17131720

@@ -1720,7 +1727,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17201727
#ifndef MIN
17211728
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
17221729
#endif
1723-
@@ -150,10 +150,10 @@
1730+
@@ -150,10 +152,10 @@
17241731

17251732
struct buffer {
17261733
int fd;
@@ -1733,7 +1740,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17331740
void *ebuf;
17341741
size_t elen;
17351742
};
1736-
@@ -243,7 +243,7 @@
1743+
@@ -243,7 +245,7 @@
17371744
#define FILE_DER 48
17381745
#define FILE_NAMES_SIZE 49 /* size of array to contain all names */
17391746

@@ -1742,7 +1749,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17421749
((t) == FILE_STRING || \
17431750
(t) == FILE_PSTRING || \
17441751
(t) == FILE_BESTRING16 || \
1745-
@@ -447,28 +447,23 @@
1752+
@@ -447,28 +449,23 @@
17461753
/* Type for Unicode characters */
17471754
typedef unsigned long unichar;
17481755

@@ -1776,7 +1783,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17761783
protected int file_zmagic(struct magic_set *, const struct buffer *,
17771784
const char *);
17781785
#endif
1779-
@@ -491,13 +486,9 @@
1786+
@@ -491,13 +488,9 @@
17801787
protected void file_badread(struct magic_set *);
17811788
protected void file_badseek(struct magic_set *);
17821789
protected void file_oomem(struct magic_set *, size_t);
@@ -1793,7 +1800,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
17931800
protected void file_showstr(FILE *, const char *, size_t);
17941801
protected size_t file_mbswidth(const char *);
17951802
protected const char *file_getbuffer(struct magic_set *);
1796-
@@ -513,34 +504,13 @@
1803+
@@ -513,34 +506,13 @@
17971804
size_t);
17981805
#endif /* __EMX__ */
17991806

@@ -1831,7 +1838,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
18311838

18321839
typedef struct {
18331840
char *buf;
1834-
@@ -550,28 +520,13 @@
1841+
@@ -550,28 +522,13 @@
18351842
protected file_pushbuf_t *file_push_buffer(struct magic_set *);
18361843
protected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
18371844

@@ -1862,7 +1869,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
18621869
size_t strlcat(char *, const char *, size_t);
18631870
#endif
18641871
#ifndef HAVE_STRCASESTR
1865-
@@ -587,39 +542,6 @@
1872+
@@ -587,39 +544,6 @@
18661873
#ifndef HAVE_ASCTIME_R
18671874
char *asctime_r(const struct tm *, char *);
18681875
#endif
@@ -1902,7 +1909,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
19021909

19031910
#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
19041911
#define QUICK
1905-
@@ -645,6 +567,18 @@
1912+
@@ -645,6 +569,18 @@
19061913
#else
19071914
#define FILE_RCSID(id)
19081915
#endif
@@ -1923,7 +1930,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
19231930
#endif
19241931
diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
19251932
--- libmagic.orig/fsmagic.c 2019-05-07 04:26:48.000000000 +0200
1926-
+++ libmagic/fsmagic.c 2020-02-26 23:18:22.616403500 +0100
1933+
+++ libmagic/fsmagic.c 2020-09-07 00:42:14.447562400 +0200
19271934
@@ -66,26 +66,10 @@
19281935
# define minor(dev) ((dev) & 0xff)
19291936
#endif
@@ -2216,7 +2223,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
22162223
case S_IFSOCK:
22172224
diff -u libmagic.orig/funcs.c libmagic/funcs.c
22182225
--- libmagic.orig/funcs.c 2019-05-07 04:27:11.000000000 +0200
2219-
+++ libmagic/funcs.c 2020-02-27 11:45:38.445854000 +0100
2226+
+++ libmagic/funcs.c 2020-09-07 00:42:14.447562400 +0200
22202227
@@ -31,7 +31,6 @@
22212228
#endif /* lint */
22222229

@@ -2572,7 +2579,7 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c
25722579

25732580
diff -u libmagic.orig/magic.c libmagic/magic.c
25742581
--- libmagic.orig/magic.c 2019-05-07 04:27:11.000000000 +0200
2575-
+++ libmagic/magic.c 2020-02-26 23:18:22.621402800 +0100
2582+
+++ libmagic/magic.c 2020-09-07 00:42:14.447562400 +0200
25762583
@@ -25,11 +25,6 @@
25772584
* SUCH DAMAGE.
25782585
*/
@@ -3036,8 +3043,8 @@ diff -u libmagic.orig/magic.c libmagic/magic.c
30363043
public const char *
30373044
magic_error(struct magic_set *ms)
30383045
diff -u libmagic.orig/magic.h libmagic/magic.h
3039-
--- libmagic.orig/magic.h 2020-03-02 15:24:27.253951700 +0100
3040-
+++ libmagic/magic.h 2020-02-26 23:18:22.622402300 +0100
3046+
--- libmagic.orig/magic.h 2020-11-23 17:12:12.776465800 +0100
3047+
+++ libmagic/magic.h 2020-09-07 00:42:14.447562400 +0200
30413048
@@ -124,6 +124,7 @@
30423049

30433050
const char *magic_getpath(const char *, int);
@@ -3048,7 +3055,7 @@ diff -u libmagic.orig/magic.h libmagic/magic.h
30483055

30493056
diff -u libmagic.orig/print.c libmagic/print.c
30503057
--- libmagic.orig/print.c 2019-03-12 21:43:05.000000000 +0100
3051-
+++ libmagic/print.c 2020-02-26 23:18:22.625401800 +0100
3058+
+++ libmagic/print.c 2020-09-07 00:42:14.447562400 +0200
30523059
@@ -28,6 +28,7 @@
30533060
/*
30543061
* print.c - debugging printout routines
@@ -3122,7 +3129,7 @@ diff -u libmagic.orig/print.c libmagic/print.c
31223129
goto out;
31233130
diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
31243131
--- libmagic.orig/readcdf.c 2019-03-12 21:43:05.000000000 +0100
3125-
+++ libmagic/readcdf.c 2020-02-27 11:45:38.445854000 +0100
3132+
+++ libmagic/readcdf.c 2020-09-07 00:42:14.463191200 +0200
31263133
@@ -31,7 +31,11 @@
31273134

31283135
#include <assert.h>
@@ -3241,7 +3248,7 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
32413248
if (i != -1)
32423249
diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
32433250
--- libmagic.orig/softmagic.c 2019-05-17 04:24:59.000000000 +0200
3244-
+++ libmagic/softmagic.c 2020-03-02 15:23:10.176763300 +0100
3251+
+++ libmagic/softmagic.c 2020-09-07 00:42:14.463191200 +0200
32453252
@@ -43,6 +43,10 @@
32463253
#include <time.h>
32473254
#include "der.h"
@@ -3608,7 +3615,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
36083615
case FILE_INDIRECT:
36093616
diff -u libmagic.orig/strcasestr.c libmagic/strcasestr.c
36103617
--- libmagic.orig/strcasestr.c 2014-09-11 17:05:33.000000000 +0200
3611-
+++ libmagic/strcasestr.c 2019-11-29 08:49:38.434136600 +0100
3618+
+++ libmagic/strcasestr.c 2020-08-05 15:01:55.644887300 +0200
36123619
@@ -39,6 +39,8 @@
36133620

36143621
#include "file.h"

ext/fileinfo/libmagic/file.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
#include <sys/stat.h>
8383
#include <stdarg.h>
8484

85+
#define abort() zend_error_noreturn(E_ERROR, "fatal libmagic error")
86+
8587
#define ENABLE_CONDITIONALS
8688

8789
#ifndef MAGIC

ext/fileinfo/tests/bug77961.magic

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
0 string 1
2+
>1 regex \^[0-9:,\ ]*-->[0-9:,\ ]* SubRip File
3+
!:mime text/x-srt
4+
5+
0 lelong 0xc3cbc6c5 RISC OS Chunk data
6+
>12 string OBJ_ \b, AOF object
7+
>12 string LIB_ \b, ALF library
8+
9+
0 name mach-o \b [
10+
>0 use mach-o-cpu \b
11+
>(8.L) indirect 8 \b:
12+
>0 belong x \b]
13+
14+
0 belong 0xcafed00d JAR compressed with pack200,
15+
>5 byte x version %d.
16+
>4 byte x \b%d
17+
!:mime application/x-java-pack200
18+
19+
# Objective-C
20+
0 regex \^#import Objective-C source text
21+
!:strength + 25
22+
!:mime text/x-objective-c
23+
24+
0 string \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Source:
25+
>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Graph:
26+
>>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Data: GCOV coverage report
27+
28+
0 name certinfo
29+
>0 der seq
30+
>>&0 der set
31+
>>>&0 der seq
32+
>>>>&0 der obj_id3=550406
33+
>>>>&0 der prt_str=x \b, countryName=%s
34+
>>&0 der set
35+
>>>&0 der seq
36+
>>>>&0 der obj_id3=550408
37+
>>>>&0 der utf8_str=x \b, stateOrProvinceName=%s
38+
>>&0 der set
39+
>>>&0 der seq
40+
>>>>&0 der obj_id3=55040a
41+
>>>>&0 der utf8_str=x \b, organizationName=%s
42+
>>&0 der set
43+
>>>&0 der seq
44+
>>>>&0 der obj_id3=550403
45+
>>>>&0 der utf8_str=x \b, commonName=%s
46+
>>&0 der seq
47+
48+
0 search/1 FONT ASCII vfont text
49+
0 short 0436 Berkeley vfont data
50+
0 short 017001 byte-swapped Berkeley vfont data

ext/fileinfo/tests/bug77961.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bug #77961 (finfo_open crafted magic parsing SIGABRT)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('fileinfo')) die('skip fileinfo extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
finfo_open(FILEINFO_NONE, __DIR__ . '/bug77961.magic');
10+
?>
11+
--EXPECTF--
12+
Notice: finfo_open(): Warning: Expected numeric type got `indirect' in %s on line %d
13+
14+
Fatal error: fatal libmagic error in %s on line %d

0 commit comments

Comments
 (0)