]> granicus.if.org Git - php/commitdiff
Fix #75457: heap-use-after-free in php7.0.25
authorChristoph M. Becker <cmbecker69@gmx.de>
Fri, 16 Aug 2019 12:29:19 +0000 (14:29 +0200)
committerStanislav Malyshev <stas@php.net>
Mon, 26 Aug 2019 02:19:50 +0000 (19:19 -0700)
Backport <https://vcs.pcre.org/pcre?view=revision&revision=1638>.

ext/pcre/pcrelib/pcre_compile.c
ext/pcre/tests/bug75457.phpt [new file with mode: 0644]

index c7827745c86c210143e9e14f26f4977ed5ff2269..402c4284d14f77f49a8a12158433861de1dd851b 100644 (file)
@@ -483,7 +483,7 @@ static const char error_texts[] =
   "lookbehind assertion is not fixed length\0"
   "malformed number or name after (?(\0"
   "conditional group contains more than two branches\0"
-  "assertion expected after (?(\0"
+  "assertion expected after (?( or (?(?C)\0"
   "(?R or (?[+-]digits must be followed by )\0"
   /* 30 */
   "unknown POSIX class name\0"
@@ -6732,6 +6732,15 @@ for (;; ptr++)
           for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;
           if (ptr[i] == CHAR_RIGHT_PARENTHESIS)
             tempptr += i + 1;
+
+          /* tempptr should now be pointing to the opening parenthesis of the
+          assertion condition. */
+
+          if (*tempptr != CHAR_LEFT_PARENTHESIS)
+            {
+            *errorcodeptr = ERR28;
+            goto FAILED;
+            }
           }
 
         /* For conditions that are assertions, check the syntax, and then exit
diff --git a/ext/pcre/tests/bug75457.phpt b/ext/pcre/tests/bug75457.phpt
new file mode 100644 (file)
index 0000000..c7ce9ed
--- /dev/null
@@ -0,0 +1,10 @@
+--TEST--
+Bug #75457 (heap-use-after-free in php7.0.25)
+--FILE--
+<?php
+$pattern = "/(((?(?C)0?=))(?!()0|.(?0)0)())/";
+var_dump(preg_match($pattern, "hello"));
+?>
+--EXPECTF--
+Warning: preg_match(): Compilation failed: assertion expected after (?( or (?(?C) at offset 4 in %sbug75457.php on line %d
+bool(false)