Skip to content

Commit 95fa727

Browse files
committed
Upgrade to PCRE 8.37 due to various bugfixes
1 parent 9c5c3ff commit 95fa727

36 files changed

+47118
-187
lines changed

NEWS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ PHP NEWS
33
?? ??? 2015 PHP 5.4.41
44

55
- PCRE
6-
. Upgraded pcrelib to 8.36.
6+
. Upgraded pcrelib to 8.37.
77

88
16 Apr 2015 PHP 5.4.40
99

ext/pcre/config.w32

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
EXTENSION("pcre", "php_pcre.c", false /* never shared */,
55
"-Iext/pcre/pcrelib");
6-
ADD_SOURCES("ext/pcre/pcrelib", "pcre_chartables.c pcre_ucd.c pcre_compile.c pcre_config.c pcre_exec.c pcre_fullinfo.c pcre_get.c pcre_globals.c pcre_maketables.c pcre_newline.c pcre_ord2utf8.c pcre_refcount.c pcre_study.c pcre_tables.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c", "pcre");
6+
ADD_SOURCES("ext/pcre/pcrelib", "pcre_chartables.c pcre_ucd.c pcre_compile.c pcre_config.c pcre_exec.c pcre_fullinfo.c pcre_get.c pcre_globals.c pcre_maketables.c pcre_newline.c pcre_ord2utf8.c pcre_refcount.c pcre_study.c pcre_tables.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c pcre_jit_compile.c", "pcre");
77
ADD_DEF_FILE("ext\\pcre\\php_pcre.def");
88

99
AC_DEFINE('HAVE_BUNDLED_PCRE', 1, 'Using bundled PCRE library');

ext/pcre/config0.m4

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ PHP_ARG_WITH(pcre-regex,,
5858
pcrelib/pcre_maketables.c pcrelib/pcre_newline.c \
5959
pcrelib/pcre_ord2utf8.c pcrelib/pcre_refcount.c pcrelib/pcre_study.c \
6060
pcrelib/pcre_tables.c pcrelib/pcre_valid_utf8.c \
61-
pcrelib/pcre_version.c pcrelib/pcre_xclass.c"
61+
pcrelib/pcre_version.c pcrelib/pcre_xclass.c \
62+
pcrelib/pcre_jit_compile.c"
6263
PHP_PCRE_CFLAGS="-DHAVE_CONFIG_H -I@ext_srcdir@/pcrelib"
6364
PHP_NEW_EXTENSION(pcre, $pcrelib_sources php_pcre.c, no,,$PHP_PCRE_CFLAGS)
6465
PHP_ADD_BUILD_DIR($ext_builddir/pcrelib)

ext/pcre/pcrelib/AUTHORS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Email domain: cam.ac.uk
88
University of Cambridge Computing Service,
99
Cambridge, England.
1010

11-
Copyright (c) 1997-2014 University of Cambridge
11+
Copyright (c) 1997-2015 University of Cambridge
1212
All rights reserved
1313

1414

@@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
1919
Email local part: hzmester
2020
Emain domain: freemail.hu
2121

22-
Copyright(c) 2010-2014 Zoltan Herczeg
22+
Copyright(c) 2010-2015 Zoltan Herczeg
2323
All rights reserved.
2424

2525

@@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
3030
Email local part: hzmester
3131
Emain domain: freemail.hu
3232

33-
Copyright(c) 2009-2014 Zoltan Herczeg
33+
Copyright(c) 2009-2015 Zoltan Herczeg
3434
All rights reserved.
3535

3636

ext/pcre/pcrelib/ChangeLog

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,173 @@
11
ChangeLog for PCRE
22
------------------
33

4+
Version 8.37 28-April-2015
5+
--------------------------
6+
7+
1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges
8+
for those parentheses to be closed with whatever has been captured so far.
9+
However, it was failing to mark any other groups between the hightest
10+
capture so far and the currrent group as "unset". Thus, the ovector for
11+
those groups contained whatever was previously there. An example is the
12+
pattern /(x)|((*ACCEPT))/ when matched against "abcd".
13+
14+
2. If an assertion condition was quantified with a minimum of zero (an odd
15+
thing to do, but it happened), SIGSEGV or other misbehaviour could occur.
16+
17+
3. If a pattern in pcretest input had the P (POSIX) modifier followed by an
18+
unrecognized modifier, a crash could occur.
19+
20+
4. An attempt to do global matching in pcretest with a zero-length ovector
21+
caused a crash.
22+
23+
5. Fixed a memory leak during matching that could occur for a subpattern
24+
subroutine call (recursive or otherwise) if the number of captured groups
25+
that had to be saved was greater than ten.
26+
27+
6. Catch a bad opcode during auto-possessification after compiling a bad UTF
28+
string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad
29+
UTF with NO_UTF_CHECK is documented as having an undefined outcome.
30+
31+
7. A UTF pattern containing a "not" match of a non-ASCII character and a
32+
subroutine reference could loop at compile time. Example: /[^\xff]((?1))/.
33+
34+
8. When a pattern is compiled, it remembers the highest back reference so that
35+
when matching, if the ovector is too small, extra memory can be obtained to
36+
use instead. A conditional subpattern whose condition is a check on a
37+
capture having happened, such as, for example in the pattern
38+
/^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not
39+
setting the highest backreference number. This mattered only if pcre_exec()
40+
was called with an ovector that was too small to hold the capture, and there
41+
was no other kind of back reference (a situation which is probably quite
42+
rare). The effect of the bug was that the condition was always treated as
43+
FALSE when the capture could not be consulted, leading to a incorrect
44+
behaviour by pcre_exec(). This bug has been fixed.
45+
46+
9. A reference to a duplicated named group (either a back reference or a test
47+
for being set in a conditional) that occurred in a part of the pattern where
48+
PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern
49+
to be incorrectly calculated, leading to overwriting.
50+
51+
10. A mutually recursive set of back references such as (\2)(\1) caused a
52+
segfault at study time (while trying to find the minimum matching length).
53+
The infinite loop is now broken (with the minimum length unset, that is,
54+
zero).
55+
56+
11. If an assertion that was used as a condition was quantified with a minimum
57+
of zero, matching went wrong. In particular, if the whole group had
58+
unlimited repetition and could match an empty string, a segfault was
59+
likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows
60+
assertions to be quantified, but not if they are being used as conditions,
61+
so the above pattern is faulted by Perl. PCRE has now been changed so that
62+
it also rejects such patterns.
63+
64+
12. A possessive capturing group such as (a)*+ with a minimum repeat of zero
65+
failed to allow the zero-repeat case if pcre2_exec() was called with an
66+
ovector too small to capture the group.
67+
68+
13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by
69+
Red Hat Product Security:
70+
71+
(a) A crash if /K and /F were both set with the option to save the compiled
72+
pattern.
73+
74+
(b) Another crash if the option to print captured substrings in a callout
75+
was combined with setting a null ovector, for example \O\C+ as a subject
76+
string.
77+
78+
14. A pattern such as "((?2){0,1999}())?", which has a group containing a
79+
forward reference repeated a large (but limited) number of times within a
80+
repeated outer group that has a zero minimum quantifier, caused incorrect
81+
code to be compiled, leading to the error "internal error:
82+
previously-checked referenced subpattern not found" when an incorrect
83+
memory address was read. This bug was reported as "heap overflow",
84+
discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number
85+
CVE-2015-2325.
86+
87+
23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine
88+
call within a group that also contained a recursive back reference caused
89+
incorrect code to be compiled. This bug was reported as "heap overflow",
90+
discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE
91+
number CVE-2015-2326.
92+
93+
24. Computing the size of the JIT read-only data in advance has been a source
94+
of various issues, and new ones are still appear unfortunately. To fix
95+
existing and future issues, size computation is eliminated from the code,
96+
and replaced by on-demand memory allocation.
97+
98+
25. A pattern such as /(?i)[A-`]/, where characters in the other case are
99+
adjacent to the end of the range, and the range contained characters with
100+
more than one other case, caused incorrect behaviour when compiled in UTF
101+
mode. In that example, the range a-j was left out of the class.
102+
103+
26. Fix JIT compilation of conditional blocks, which assertion
104+
is converted to (*FAIL). E.g: /(?(?!))/.
105+
106+
27. The pattern /(?(?!)^)/ caused references to random memory. This bug was
107+
discovered by the LLVM fuzzer.
108+
109+
28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly
110+
when this assertion was used as a condition, for example (?(?!)a|b). In
111+
pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect
112+
error about an unsupported item.
113+
114+
29. For some types of pattern, for example /Z*(|d*){216}/, the auto-
115+
possessification code could take exponential time to complete. A recursion
116+
depth limit of 1000 has been imposed to limit the resources used by this
117+
optimization.
118+
119+
30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class
120+
such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored
121+
because \S ensures they are all in the class. The code for doing this was
122+
interacting badly with the code for computing the amount of space needed to
123+
compile the pattern, leading to a buffer overflow. This bug was discovered
124+
by the LLVM fuzzer.
125+
126+
31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside
127+
other kinds of group caused stack overflow at compile time. This bug was
128+
discovered by the LLVM fuzzer.
129+
130+
32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment
131+
between a subroutine call and its quantifier was incorrectly compiled,
132+
leading to buffer overflow or other errors. This bug was discovered by the
133+
LLVM fuzzer.
134+
135+
33. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an
136+
assertion after (?(. The code was failing to check the character after
137+
(?(?< for the ! or = that would indicate a lookbehind assertion. This bug
138+
was discovered by the LLVM fuzzer.
139+
140+
34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with
141+
a fixed maximum following a group that contains a subroutine reference was
142+
incorrectly compiled and could trigger buffer overflow. This bug was
143+
discovered by the LLVM fuzzer.
144+
145+
35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))
146+
caused a stack overflow instead of the diagnosis of a non-fixed length
147+
lookbehind assertion. This bug was discovered by the LLVM fuzzer.
148+
149+
36. The use of \K in a positive lookbehind assertion in a non-anchored pattern
150+
(e.g. /(?<=\Ka)/) could make pcregrep loop.
151+
152+
37. There was a similar problem to 36 in pcretest for global matches.
153+
154+
38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*),
155+
and a subsequent item in the pattern caused a non-match, backtracking over
156+
the repeated \X did not stop, but carried on past the start of the subject,
157+
causing reference to random memory and/or a segfault. There were also some
158+
other cases where backtracking after \C could crash. This set of bugs was
159+
discovered by the LLVM fuzzer.
160+
161+
39. The function for finding the minimum length of a matching string could take
162+
a very long time if mutual recursion was present many times in a pattern,
163+
for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection
164+
method has been implemented. This infelicity was discovered by the LLVM
165+
fuzzer.
166+
167+
40. Static linking against the PCRE library using the pkg-config module was
168+
failing on missing pthread symbols.
169+
170+
4171
Version 8.36 26-September-2014
5172
------------------------------
6173

ext/pcre/pcrelib/LICENCE

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ and semantics are as close as possible to those of the Perl 5 language.
66

77
Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
88
specified below. The documentation for PCRE, supplied in the "doc"
9-
directory, is distributed under the same terms as the software itself.
9+
directory, is distributed under the same terms as the software itself. The data
10+
in the testdata directory is not copyrighted and is in the public domain.
1011

1112
The basic library functions are written in C and are freestanding. Also
1213
included in the distribution is a set of C++ wrapper functions, and a
@@ -24,7 +25,7 @@ Email domain: cam.ac.uk
2425
University of Cambridge Computing Service,
2526
Cambridge, England.
2627

27-
Copyright (c) 1997-2014 University of Cambridge
28+
Copyright (c) 1997-2015 University of Cambridge
2829
All rights reserved.
2930

3031

@@ -35,7 +36,7 @@ Written by: Zoltan Herczeg
3536
Email local part: hzmester
3637
Emain domain: freemail.hu
3738

38-
Copyright(c) 2010-2014 Zoltan Herczeg
39+
Copyright(c) 2010-2015 Zoltan Herczeg
3940
All rights reserved.
4041

4142

@@ -46,7 +47,7 @@ Written by: Zoltan Herczeg
4647
Email local part: hzmester
4748
Emain domain: freemail.hu
4849

49-
Copyright(c) 2009-2014 Zoltan Herczeg
50+
Copyright(c) 2009-2015 Zoltan Herczeg
5051
All rights reserved.
5152

5253

ext/pcre/pcrelib/NEWS

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
News about PCRE releases
22
------------------------
33

4+
Release 8.37 28-April-2015
5+
--------------------------
6+
7+
This is bug-fix release. Note that this library (now called PCRE1) is now being
8+
maintained for bug fixes only. New projects are advised to use the new PCRE2
9+
libraries.
10+
11+
412
Release 8.36 26-September-2014
513
------------------------------
614

ext/pcre/pcrelib/README

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
README file for PCRE (Perl-compatible regular expression library)
22
-----------------------------------------------------------------
33

4-
The latest release of PCRE is always available in three alternative formats
4+
NOTE: This set of files relates to PCRE releases that use the original API,
5+
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
6+
first release of a new API, known as PCRE2, with release numbers starting at
7+
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
8+
libraries (now called PCRE1) are still being maintained for bug fixes, but
9+
there will be no new development. New projects are advised to use the new PCRE2
10+
libraries.
11+
12+
13+
The latest release of PCRE1 is always available in three alternative formats
514
from:
615

716
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
@@ -990,4 +999,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
990999
Philip Hazel
9911000
Email local part: ph10
9921001
Email domain: cam.ac.uk
993-
Last updated: 24 October 2014
1002+
Last updated: 10 February 2015

ext/pcre/pcrelib/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ them both to 0; an emulation function will be used. */
395395
#undef SUPPORT_GCOV
396396

397397
/* Define to any value to enable support for Just-In-Time compiling. */
398-
#undef SUPPORT_JIT
398+
#define SUPPORT_JIT
399399

400400
/* Define to any value to allow pcregrep to be linked with libbz2, so that it
401401
is able to handle .bz2 files. */

0 commit comments

Comments
 (0)