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