Skip to content

Commit aa88f33

Browse files
cmb69smalyshev
authored andcommitted
Fix #79283: Segfault in libmagic patch contains a buffer overflow
To solve this, we properly calculate the required string length upfront instead of allocating an oversized string (`len * 4 + 4`).
1 parent db848e1 commit aa88f33

File tree

3 files changed

+76
-26
lines changed

3 files changed

+76
-26
lines changed

ext/fileinfo/libmagic.patch

Lines changed: 38 additions & 24 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-03-02 15:04:23.670412600 +0100
3+
+++ libmagic/apprentice.c 2020-02-27 11:45:38.445854000 +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-03-02 15:04:23.671413500 +0100
977+
+++ libmagic/ascmagic.c 2020-02-26 23:18:22.605400700 +0100
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-03-02 15:04:23.672412500 +0100
1008+
+++ libmagic/buffer.c 2020-02-27 11:45:38.445854000 +0100
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-03-02 15:04:23.674415200 +0100
1065+
+++ libmagic/cdf.c 2020-02-27 11:45:38.445854000 +0100
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-03-02 15:04:23.675416900 +0100
1344+
+++ libmagic/cdf.h 2020-02-27 11:45:38.445854000 +0100
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-03-02 15:04:23.676413000 +0100
1369+
+++ libmagic/cdf_time.c 2020-02-26 23:18:22.611402900 +0100
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-03-02 15:04:23.676413000 +0100
1398+
+++ libmagic/compress.c 2020-02-27 11:45:38.445854000 +0100
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-03-02 15:04:23.677412900 +0100
1548+
+++ libmagic/der.c 2020-02-27 11:45:38.445854000 +0100
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-03-02 15:04:23.679414300 +0100
1578+
+++ libmagic/elfclass.h 2020-02-26 23:18:22.613401700 +0100
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-03-02 15:04:23.680413600 +0100
1608+
+++ libmagic/encoding.c 2020-02-26 23:18:22.614402300 +0100
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-03-02 15:04:23.682414300 +0100
1639+
+++ libmagic/file.h 2020-02-27 11:45:38.445854000 +0100
16401640
@@ -33,18 +33,9 @@
16411641
#ifndef __file_h__
16421642
#define __file_h__
@@ -1923,7 +1923,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
19231923
#endif
19241924
diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
19251925
--- libmagic.orig/fsmagic.c 2019-05-07 04:26:48.000000000 +0200
1926-
+++ libmagic/fsmagic.c 2020-03-02 15:04:23.683417500 +0100
1926+
+++ libmagic/fsmagic.c 2020-02-26 23:18:22.616403500 +0100
19271927
@@ -66,26 +66,10 @@
19281928
# define minor(dev) ((dev) & 0xff)
19291929
#endif
@@ -2216,7 +2216,7 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
22162216
case S_IFSOCK:
22172217
diff -u libmagic.orig/funcs.c libmagic/funcs.c
22182218
--- libmagic.orig/funcs.c 2019-05-07 04:27:11.000000000 +0200
2219-
+++ libmagic/funcs.c 2020-03-02 15:04:23.684415800 +0100
2219+
+++ libmagic/funcs.c 2020-02-27 11:45:38.445854000 +0100
22202220
@@ -31,7 +31,6 @@
22212221
#endif /* lint */
22222222

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

25732573
diff -u libmagic.orig/magic.c libmagic/magic.c
25742574
--- libmagic.orig/magic.c 2019-05-07 04:27:11.000000000 +0200
2575-
+++ libmagic/magic.c 2020-03-02 15:04:23.686413600 +0100
2575+
+++ libmagic/magic.c 2020-02-26 23:18:22.621402800 +0100
25762576
@@ -25,11 +25,6 @@
25772577
* SUCH DAMAGE.
25782578
*/
@@ -3036,8 +3036,8 @@ diff -u libmagic.orig/magic.c libmagic/magic.c
30363036
public const char *
30373037
magic_error(struct magic_set *ms)
30383038
diff -u libmagic.orig/magic.h libmagic/magic.h
3039-
--- libmagic.orig/magic.h 2020-03-02 15:06:39.235737800 +0100
3040-
+++ libmagic/magic.h 2020-03-02 15:04:23.686413600 +0100
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
30413041
@@ -124,6 +124,7 @@
30423042

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

30493049
diff -u libmagic.orig/print.c libmagic/print.c
30503050
--- libmagic.orig/print.c 2019-03-12 21:43:05.000000000 +0100
3051-
+++ libmagic/print.c 2020-03-02 15:04:23.688414000 +0100
3051+
+++ libmagic/print.c 2020-02-26 23:18:22.625401800 +0100
30523052
@@ -28,6 +28,7 @@
30533053
/*
30543054
* print.c - debugging printout routines
@@ -3122,7 +3122,7 @@ diff -u libmagic.orig/print.c libmagic/print.c
31223122
goto out;
31233123
diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
31243124
--- libmagic.orig/readcdf.c 2019-03-12 21:43:05.000000000 +0100
3125-
+++ libmagic/readcdf.c 2020-03-02 15:04:23.689414500 +0100
3125+
+++ libmagic/readcdf.c 2020-02-27 11:45:38.445854000 +0100
31263126
@@ -31,7 +31,11 @@
31273127

31283128
#include <assert.h>
@@ -3241,7 +3241,7 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
32413241
if (i != -1)
32423242
diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
32433243
--- libmagic.orig/softmagic.c 2019-05-17 04:24:59.000000000 +0200
3244-
+++ libmagic/softmagic.c 2020-03-02 15:04:23.690413500 +0100
3244+
+++ libmagic/softmagic.c 2020-03-02 15:23:10.176763300 +0100
32453245
@@ -43,6 +43,10 @@
32463246
#include <time.h>
32473247
#include "der.h"
@@ -3414,18 +3414,32 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
34143414
return rv;
34153415

34163416
case FILE_USE:
3417-
@@ -1926,6 +1904,47 @@
3417+
@@ -1926,6 +1904,61 @@
34183418
return file_strncmp(a, b, len, flags);
34193419
}
34203420

34213421
+public void
34223422
+convert_libmagic_pattern(zval *pattern, char *val, size_t len, uint32_t options)
34233423
+{
3424-
+ int i, j=0;
3424+
+ int i, j;
34253425
+ zend_string *t;
34263426
+
3427-
+ t = zend_string_alloc(len * 2 + 4, 0);
3427+
+ for (i = j = 0; i < len; i++) {
3428+
+ switch (val[i]) {
3429+
+ case '~':
3430+
+ j += 2;
3431+
+ break;
3432+
+ case '\0':
3433+
+ j += 4;
3434+
+ break;
3435+
+ default:
3436+
+ j++;
3437+
+ break;
3438+
+ }
3439+
+ }
3440+
+ t = zend_string_alloc(j + 4, 0);
34283441
+
3442+
+ j = 0;
34293443
+ ZSTR_VAL(t)[j++] = '~';
34303444
+
34313445
+ for (i = 0; i < len; i++, j++) {
@@ -3462,7 +3476,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
34623476
private int
34633477
magiccheck(struct magic_set *ms, struct magic *m)
34643478
{
3465-
@@ -2104,65 +2123,77 @@
3479+
@@ -2104,65 +2137,77 @@
34663480
break;
34673481
}
34683482
case FILE_REGEX: {
@@ -3594,7 +3608,7 @@ diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
35943608
case FILE_INDIRECT:
35953609
diff -u libmagic.orig/strcasestr.c libmagic/strcasestr.c
35963610
--- libmagic.orig/strcasestr.c 2014-09-11 17:05:33.000000000 +0200
3597-
+++ libmagic/strcasestr.c 2019-04-02 11:56:06.853152400 +0200
3611+
+++ libmagic/strcasestr.c 2019-11-29 08:49:38.434136600 +0100
35983612
@@ -39,6 +39,8 @@
35993613

36003614
#include "file.h"

ext/fileinfo/libmagic/softmagic.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,11 +1907,25 @@ file_strncmp16(const char *a, const char *b, size_t len, uint32_t flags)
19071907
public void
19081908
convert_libmagic_pattern(zval *pattern, char *val, size_t len, uint32_t options)
19091909
{
1910-
int i, j=0;
1910+
int i, j;
19111911
zend_string *t;
19121912

1913-
t = zend_string_alloc(len * 2 + 4, 0);
1913+
for (i = j = 0; i < len; i++) {
1914+
switch (val[i]) {
1915+
case '~':
1916+
j += 2;
1917+
break;
1918+
case '\0':
1919+
j += 4;
1920+
break;
1921+
default:
1922+
j++;
1923+
break;
1924+
}
1925+
}
1926+
t = zend_string_alloc(j + 4, 0);
19141927

1928+
j = 0;
19151929
ZSTR_VAL(t)[j++] = '~';
19161930

19171931
for (i = 0; i < len; i++, j++) {

ext/fileinfo/tests/bug79283.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #79283 (Segfault in libmagic patch contains a buffer overflow)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('fileinfo')) die('skip fileinfo extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
$magic_file = __DIR__ . '/bug79283.db';
10+
file_put_contents($magic_file, "
11+
0 regex \\0\\0\\0\\0 Test
12+
");
13+
14+
$finfo = new finfo(FILEINFO_NONE, $magic_file);
15+
var_dump($finfo->buffer("buffer\n"));
16+
?>
17+
--CLEAN--
18+
<?php
19+
unlink(__DIR__ . '/bug79283.db');
20+
?>
21+
--EXPECT--
22+
string(10) "ASCII text"

0 commit comments

Comments
 (0)