af9dc8
From f938112c495b0d26572435c0be73ac0bfe642ecd Mon Sep 17 00:00:00 2001
af9dc8
From: Stanislav Malyshev <stas@php.net>
af9dc8
Date: Sat, 4 Apr 2015 15:01:37 -0700
af9dc8
Subject: [PATCH] Fix bug #68819 (Fileinfo on specific file causes spurious OOM
af9dc8
 and/or segfault)
af9dc8
af9dc8
---
af9dc8
 ext/fileinfo/libmagic/softmagic.c    |  3 +++
af9dc8
 ext/fileinfo/tests/bug68819_001.phpt | 18 ++++++++++++++++++
af9dc8
 ext/fileinfo/tests/bug68819_002.phpt | 26 ++++++++++++++++++++++++++
af9dc8
 3 files changed, 47 insertions(+)
af9dc8
 create mode 100644 ext/fileinfo/tests/bug68819_001.phpt
af9dc8
 create mode 100644 ext/fileinfo/tests/bug68819_002.phpt
af9dc8
af9dc8
diff --git a/ext/fileinfo/libmagic/softmagic.c b/ext/fileinfo/libmagic/softmagic.c
af9dc8
index e7b7855..54c1a03 100644
af9dc8
--- a/ext/fileinfo/libmagic/softmagic.c
af9dc8
+++ b/ext/fileinfo/libmagic/softmagic.c
af9dc8
@@ -1037,6 +1037,9 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
af9dc8
 			if (bytecnt > nbytes) {
af9dc8
 				bytecnt = nbytes;
af9dc8
 			}
af9dc8
+			if (offset > bytecnt) {
af9dc8
+				offset = bytecnt;
af9dc8
+			}
af9dc8
 			if (s == NULL) {
af9dc8
 				ms->search.s_len = 0;
af9dc8
 				ms->search.s = NULL;
af9dc8
diff --git a/ext/fileinfo/tests/bug68819_001.phpt b/ext/fileinfo/tests/bug68819_001.phpt
af9dc8
new file mode 100644
af9dc8
index 0000000..ce39ee6
af9dc8
--- /dev/null
af9dc8
+++ b/ext/fileinfo/tests/bug68819_001.phpt
af9dc8
@@ -0,0 +1,18 @@
af9dc8
+--TEST--
af9dc8
+Bug #68819 Fileinfo on specific file causes spurious OOM and/or segfault, var 1
af9dc8
+--SKIPIF--
af9dc8
+
af9dc8
+--FILE--
af9dc8
+
af9dc8
+
af9dc8
+$string = <<
af9dc8
+----a-----'''---------a---------------a--------a-----a-----a---------a-----as-------a----a--a-------------a--as-----s---------------a---------a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s------------a-----a----------------a----s-----------------\r\n-------------------a-------a-a-------a-----a----a----s----s--------a-----------------------a----a----s-------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a----s----s--------a----------a----------------------a----a----s-------------a----------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n------a-------a-a-------a-----a----a---a-----a-----------------------a----a---a-----a------------------s-------a----a---a-----a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s------\r\n-------------------a-------a-a-------a-----a----a---a-------a------------------------a----a---a-----''--a-------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a-------s-----a---a-------------------------a----a-------------a---a-------------------s-------a----a-------------a---a-----as-a--------------a-----a--s----s---------y------------a-----a-s---a-------''----a---s--a-''------''----s------------a-y----------------s------a-----y--a-s--a-s------s--a-s----------''----------------------------a---s--a----a---------a-s---a-s--------s--------a---------s--a-y-------------as----a----a-------------a------a---s--a-s------a--------a----s----y--as--a----a-s---------------a-----a--------------------------------------\r\n-------------------a-------a-a-------a-----a----a-----------s--------a-----------------------a----a--------------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a-----------s--------a----------a----------------------a----a--------------------a------------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a---a-----------------------a----a---a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a---a----------a----------------------a----a---a------------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-----a-a-----------a-------a-a-------a-----a----a----a---s-----a-----------------------a----a----a---------a-----------------s-------a----a----a---------a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a--------a----a-----------------------a----a----------a----a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-----a-------------a-------a-a-------a-----a----a--------s-----a---a-------------------------a----a--------------a---a-------------------s-------------a---------------a----a---a---a-----as-a--------------a-----a--s----s---------y------------a-----a-s---a-------''----a---s--a-''------''----s------------a-y----------------s------a-----y--a-s--a-s------s--a-s----------''----------------------------a---s--a----a---------a-s---a-s--------s--------a---------s--a-y-------------as----a----a-------------a------a---s--a-s------a--------a----s----y--as--a----a-s---------------a-----a--------------------------------------\r\n-------------------a-------a-a-------a-----a----a----------------a-----------------------a----a----------------a------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a-------a-----a----a----------------a----------a----------------------a----a----------------a-----------------------------s-------a----a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n---a---------------a-------a-a-------a-----as------------------------a--a--s------------------a-s------------------------a-----s--a-----'''----------a-s---------------------------------------------a-----s--a-----------------a---------a---a--s-a-----a-----------asy---------a-----a-----------a----s----------------------a----s--a-------------a-------a--------a----s------------a-----a----------------a----s------------------\r\n-a-----------------a-------a-a-------a--y---------a------------------y---------a-----'''-------y------a-y--a-------------------------a---------a---a----------as-a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n-a-----------------a-------a-a-------a--y-------------a------------------y-------------a-----'''-------y----------a-y--a-------------------------a---------a---a----------as-a---a--s-a-----a-----------asy---------a-----a-----------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n-------------------a-------a-a-------a--a----a-----a------------------a----a-----a-----'''----------a----s----a----a-------s---a------------------a-----------a--s-a-----a---------------------a------a----s-a-----a-------s-s-------a----s--------a-------------a-------a--------a----s---------a-----a----------------a----s------------------\r\n------aa-----------a-------a-a------------s-a--s---------a---a------------------------a------------a---a------------------s--------a------------a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a------------------------s-----s--a----a-----------------------------------------s--a----a------------------s---------------------------------s--a----a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s--------------a-----a----------a----------s--a----------s-----------------\r\n-------------------a-------a-a--------------s-a---a--------------------------a---a------------------s----------a---a------as---s-a--------------s-----a------a-y--a-------a-----a--a--------a----s--------a-------------a-------a--------a----s---------------a-----a----------a----------s--a----------s-----------------\r\nsay-------a------------s-----''------a----s--------a-------------a-\r\n
af9dc8
+HERE;
af9dc8
+
af9dc8
+$finfo = new finfo();
af9dc8
+$type = $finfo->buffer($string);
af9dc8
+
af9dc8
+var_dump($type);
af9dc8
+?>
af9dc8
+--EXPECT--
af9dc8
+string(60) "ASCII text, with very long lines, with CRLF line terminators"
af9dc8
diff --git a/ext/fileinfo/tests/bug68819_002.phpt b/ext/fileinfo/tests/bug68819_002.phpt
af9dc8
new file mode 100644
af9dc8
index 0000000..cec238d
af9dc8
--- /dev/null
af9dc8
+++ b/ext/fileinfo/tests/bug68819_002.phpt
af9dc8
@@ -0,0 +1,26 @@
af9dc8
+--TEST--
af9dc8
+Bug #68819 Fileinfo on specific file causes spurious OOM and/or segfault, var 2
af9dc8
+--SKIPIF--
af9dc8
+
af9dc8
+--FILE--
af9dc8
+
af9dc8
+
af9dc8
+$string = '';
af9dc8
+
af9dc8
+// These two in any order
af9dc8
+$string .= "\r\n";
af9dc8
+$string .= "''''";
af9dc8
+
af9dc8
+// Total string length > 8192
af9dc8
+$string .= str_repeat(chr(rand(32, 127)), 8184);
af9dc8
+
af9dc8
+// Ending in this string
af9dc8
+$string .= "say";
af9dc8
+
af9dc8
+$finfo = new finfo();
af9dc8
+$type = $finfo->buffer($string);
af9dc8
+var_dump($type);
af9dc8
+
af9dc8
+?>
af9dc8
+--EXPECT--
af9dc8
+string(60) "ASCII text, with very long lines, with CRLF line terminators"
af9dc8
-- 
af9dc8
2.1.4
af9dc8