From 376f4451aee8fe1342f5c8a1aa6d50a4b45dbaec Mon Sep 17 00:00:00 2001 From: Erik van Pienbroek Date: Feb 06 2016 16:42:55 +0000 Subject: Update to 8.38 --- diff --git a/.gitignore b/.gitignore index 066aaf3..45be0e8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /pcre-8.33.tar.gz /pcre-8.34.tar.gz /pcre-8.36.tar.bz2 +/pcre-8.38.tar.bz2 diff --git a/mingw-pcre.spec b/mingw-pcre.spec index 4ebb46d..fae5f09 100644 --- a/mingw-pcre.spec +++ b/mingw-pcre.spec @@ -1,20 +1,63 @@ %?mingw_package_header Name: mingw-pcre -Version: 8.36 -Release: 3%{?dist} +Version: 8.38 +Release: 1%{?dist} Summary: MinGW Windows pcre library Group: Development/Libraries License: BSD URL: http://www.pcre.org/ Source0: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-%{version}.tar.bz2 -# Reset non-matched groups within capturing group up to forced match, -# bug #1161587, in upstream after 8.36 -Patch2: pcre-8.36-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch -# Fix unused memory usage on zero-repeat assertion condition, bug #1165626, -# CVE-2014-8964, in upstream after 8.36 -Patch3: pcre-8.36-Fix-zero-repeat-assertion-condition-bug.patch + +# Refused by upstream, bug #675477 +Patch1: pcre-8.32-refused_spelling_terminated.patch + +# Fix compiling comments with auto-callouts, upstream bug #1725, +# fixed in upstream after 8.38 +Patch2: pcre-8.38-Fix-auto-callout-comment-bug.patch + +# Fix compiling expressions with negated classes in UCP mode, +# upstream bug #1732, fixed in upstream after 8.38 +Patch3: pcre-8.38-Fix-negated-POSIX-class-within-negated-overall-class.patch + +# Fix compiling expressions with an isolated \E between an item and its +# qualifier with auto-callouts, upstream bug #1724, +# fixed in upstream after 8.38 +Patch4: pcre-8.38-Fix-bug-for-isolated-E-between-an-item-and-its-quali.patch + +# Fix crash in regexec() if REG_STARTEND option is set and pmatch argument is +# NULL, upstream bug #1727, fixed in upstream after 8.38 +Patch5: pcre-8.38-Give-error-for-regexec-with-pmatch-NULL-and-REG_STAR.patch + +# Fix a stack overflow when formatting a 32-bit integer in pcregrep tool, +# upstream bug #1728, fixed in upstream after 8.38 +Patch6: pcre-8.38-Allow-for-up-to-32-bit-numbers-in-the-ordin-function.patch + +# Fix compiling expressions with an empty \Q\E sequence between an item and +# its qualifier with auto-callouts, upstream bug #1735, +# fixed in upstream after 8.38 +Patch7: pcre-8.38-Fix-Q-E-before-qualifier-bug-when-auto-callouts-are-.patch + +# Fix compiling expressions with global extended modifier that is disabled by +# local no-extended option at the start of the expression just after +# a whitespace, in upstream after 8.38 +Patch8: pcre-8.38-Fix-x-bug-when-pattern-starts-with-white-space-and-x.patch + +# Fix possible crash in pcre_copy_named_substring() if a named substring has +# number greater than the space in the ovector, upstream bug #1741, +# in fixed in upstream after 8.38 +Patch9: pcre-8.38-Fix-copy-named-substring-bug.patch + +# Fix a buffer overflow when compiling an expression with named groups with +# a group that reset capture numbers, upstream bug #1742, +# fixed in upstream after 8.38 +Patch10: pcre-8.38-Fix-by-hacking-another-length-computation-issue.patch + +# Fix a crash in pcre_get_substring_list() if the use of \K caused the start +# of the match to be earlier than the end, upstream bug #1744, +# fixed in upstream after 8.38 +Patch11: pcre-8.38-Fix-get_substring_list-bug-when-K-is-used-in-an-asse.patch BuildArch: noarch @@ -91,8 +134,17 @@ Static version of the mingw64-pcre library. %prep %setup -q -n pcre-%{version} -%patch2 -p1 -b .reset_groups -%patch3 -p1 -b .zero_repeat_assertion +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 %build @@ -184,6 +236,16 @@ find $RPM_BUILD_ROOT -name "*.la" -delete %changelog +* Sat Feb 6 2016 Erik van Pienbroek - 8.38-1 +- Update to 8.38 +- Fixes various CVE's: + RHBZ #1236660, #1249905, #1250947, #1256453, #1256454, #1287616, + RHBZ #1287619, #1287626, #1287628, #1287631, #1287634, #1287640, + RHBZ #1287642, #1287648, #1287650, #1287656, #1287658, #1287661, + RHBZ #1287663, #1287668, #1287670, #1287673, #1287675, #1287692, + RHBZ #1287694, #1287698, #1287700, #1287704, #1287706, #1287720, + RHBZ #1287722 + * Thu Feb 04 2016 Fedora Release Engineering - 8.36-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild diff --git a/pcre-8.21-multilib.patch b/pcre-8.21-multilib.patch new file mode 100644 index 0000000..345e624 --- /dev/null +++ b/pcre-8.21-multilib.patch @@ -0,0 +1,37 @@ +From 1d5ce3e2e6341b01609aefab20786a8638fee17a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Tue, 6 Dec 2011 18:44:11 +0100 +Subject: [PATCH] Fix multilib + +Do not set RPATH nor add explicit -L path to compiler. +--- + pcre-config.in | 12 ------------ + 1 files changed, 0 insertions(+), 12 deletions(-) + +diff --git a/pcre-config.in b/pcre-config.in +index ccbf210..aeee182 100644 +--- a/pcre-config.in ++++ b/pcre-config.in +@@ -16,19 +16,7 @@ if test $# -eq 0; then + fi + + libR= +-case `uname -s` in +- *SunOS*) +- libR=" -R@libdir@" +- ;; +- *BSD*) +- libR=" -Wl,-R@libdir@" +- ;; +-esac +- + libS= +-if test @libdir@ != /usr/lib ; then +- libS=-L@libdir@ +-fi + + while test $# -gt 0; do + case "$1" in +-- +1.7.7.4 + diff --git a/pcre-8.32-refused_spelling_terminated.patch b/pcre-8.32-refused_spelling_terminated.patch new file mode 100644 index 0000000..32c9f7e --- /dev/null +++ b/pcre-8.32-refused_spelling_terminated.patch @@ -0,0 +1,48 @@ +From 6f8b68f2740f3100154342338ed3d26e676dae69 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Mon, 7 Feb 2011 11:37:09 +0100 +Subject: [PATCH] Fix spelling in pcretest(1) manual + +I kept some non-dictionary words to be consistent. +Credits to John Bradshaw. + +Spelling refused by upstream : + +I have applied these patches, except for "termi-nated", because my +Collins dictionary of spelling and word division shows "termin-ate" and +"termin-ating". I do know that there is a cultural difference between +British and American hyphenation conventions; I try to follow the +British ones, as exemplified in the Collins. +--- + doc/pcretest.1 | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/doc/pcretest.1 b/doc/pcretest.1 +index 41ef6ac..258a62f 100644 +--- a/doc/pcretest.1 ++++ b/doc/pcretest.1 +@@ -601,8 +601,8 @@ recognized: + after a successful match (number less than 32) + .\" JOIN + \eCname call pcre[16|32]_copy_named_substring() for substring +- "name" after a successful match (name termin- +- ated by next non alphanumeric character) ++ "name" after a successful match (name terminated ++ by next non alphanumeric character) + .\" JOIN + \eC+ show the current captured substrings at callout + time +@@ -623,8 +623,8 @@ recognized: + after a successful match (number less than 32) + .\" JOIN + \eGname call pcre[16|32]_get_named_substring() for substring +- "name" after a successful match (name termin- +- ated by next non-alphanumeric character) ++ "name" after a successful match (name terminated ++ by next non-alphanumeric character) + .\" JOIN + \eJdd set up a JIT stack of dd kilobytes maximum (any + number of digits) +-- +1.7.11.7 + diff --git a/pcre-8.36-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch b/pcre-8.36-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch deleted file mode 100644 index 13eb08d..0000000 --- a/pcre-8.36-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch +++ /dev/null @@ -1,71 +0,0 @@ -From e2eeaf85f1b5d6c4669b621d309ff904cbf96f4b Mon Sep 17 00:00:00 2001 -From: ph10 -Date: Wed, 5 Nov 2014 15:08:03 +0000 -Subject: [PATCH] Fix bug when there are unset groups prior to (*ACCEPT) within - a capturing group. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1510 2f5784b3-3f2a-0410-8824-cb99058d5e15 -Signed-off-by: Petr Písař - -Petr Pisar: Ported to 8.36 - -diff --git a/pcre_exec.c b/pcre_exec.c -index 654eb9e..fdf7067 100644 ---- a/pcre_exec.c -+++ b/pcre_exec.c -@@ -1474,7 +1474,18 @@ for (;;) - md->offset_vector[offset] = - md->offset_vector[md->offset_end - number]; - md->offset_vector[offset+1] = (int)(eptr - md->start_subject); -- if (offset_top <= offset) offset_top = offset + 2; -+ -+ /* If this group is at or above the current highwater mark, ensure that -+ any groups between the current high water mark and this group are marked -+ unset and then update the high water mark. */ -+ -+ if (offset >= offset_top) -+ { -+ register int *iptr = md->offset_vector + offset_top; -+ register int *iend = md->offset_vector + offset; -+ while (iptr < iend) *iptr++ = -1; -+ offset_top = offset + 2; -+ } - } - ecode += 1 + IMM2_SIZE; - break; -diff --git a/testdata/testinput1 b/testdata/testinput1 -index 123e3d3..091e307 100644 ---- a/testdata/testinput1 -+++ b/testdata/testinput1 -@@ -5720,4 +5720,7 @@ AbcdCBefgBhiBqz - /[\Q]a\E]+/ - aa]] - -+/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ -+ 1234abcd -+ - /-- End of testinput1 --/ -diff --git a/testdata/testoutput1 b/testdata/testoutput1 -index 5e71900..ba7ca37 100644 ---- a/testdata/testoutput1 -+++ b/testdata/testoutput1 -@@ -9411,4 +9411,13 @@ No match - aa]] - 0: aa]] - -+/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ -+ 1234abcd -+ 0: -+ 1: -+ 2: -+ 3: -+ 4: -+ 5: -+ - /-- End of testinput1 --/ --- -1.9.3 - diff --git a/pcre-8.36-Fix-zero-repeat-assertion-condition-bug.patch b/pcre-8.36-Fix-zero-repeat-assertion-condition-bug.patch deleted file mode 100644 index 1fb3036..0000000 --- a/pcre-8.36-Fix-zero-repeat-assertion-condition-bug.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 48d2472840efc4dc54dfc698d64aa086332a9033 Mon Sep 17 00:00:00 2001 -From: ph10 -Date: Wed, 19 Nov 2014 20:57:13 +0000 -Subject: [PATCH] Fix zero-repeat assertion condition bug. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1513 2f5784b3-3f2a-0410-8824-cb99058d5e15 -Signed-off-by: Petr Písař - -Petr Pisar: Ported to 8.36. - -diff --git a/pcre_exec.c b/pcre_exec.c -index fdf7067..bb5620d 100644 ---- a/pcre_exec.c -+++ b/pcre_exec.c -@@ -1404,8 +1404,11 @@ for (;;) - condition = TRUE; - - /* Advance ecode past the assertion to the start of the first branch, -- but adjust it so that the general choosing code below works. */ -- -+ but adjust it so that the general choosing code below works. If the -+ assertion has a quantifier that allows zero repeats we must skip over -+ the BRAZERO. This is a lunatic thing to do, but somebody did! */ -+ -+ if (*ecode == OP_BRAZERO) ecode++; - ecode += GET(ecode, 1); - while (*ecode == OP_ALT) ecode += GET(ecode, 1); - ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode]; -diff --git a/testdata/testinput2 b/testdata/testinput2 -index c6816bf..015422e 100644 ---- a/testdata/testinput2 -+++ b/testdata/testinput2 -@@ -4078,4 +4078,10 @@ backtracking verbs. --/ - - /\x{whatever}/ - -+"((?=(?(?=(?(?=(?(?=())))*)))))" -+ a -+ -+"(?(?=)?==)(((((((((?=)))))))))" -+ a -+ - /-- End of testinput2 --/ -diff --git a/testdata/testoutput2 b/testdata/testoutput2 -index 1e87026..9a1b14e 100644 ---- a/testdata/testoutput2 -+++ b/testdata/testoutput2 -@@ -14206,4 +14206,14 @@ Failed: digits missing in \x{} or \o{} at offset 3 - /\x{whatever}/ - Failed: non-hex character in \x{} (closing brace missing?) at offset 3 - -+"((?=(?(?=(?(?=(?(?=())))*)))))" -+ a -+ 0: -+ 1: -+ 2: -+ -+"(?(?=)?==)(((((((((?=)))))))))" -+ a -+No match -+ - /-- End of testinput2 --/ --- -1.9.3 - diff --git a/pcre-8.38-Allow-for-up-to-32-bit-numbers-in-the-ordin-function.patch b/pcre-8.38-Allow-for-up-to-32-bit-numbers-in-the-ordin-function.patch new file mode 100644 index 0000000..6926f76 --- /dev/null +++ b/pcre-8.38-Allow-for-up-to-32-bit-numbers-in-the-ordin-function.patch @@ -0,0 +1,29 @@ +From e347b40d5bb12f7ef1e632aa649571a107be7d8a Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Sun, 29 Nov 2015 17:46:23 +0000 +Subject: [PATCH 4/5] Allow for up to 32-bit numbers in the ordin() function in + pcregrep. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1615 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcregrep.c b/pcregrep.c +index 64986b0..cd53c64 100644 +--- a/pcregrep.c ++++ b/pcregrep.c +@@ -2437,7 +2437,7 @@ return options; + static char * + ordin(int n) + { +-static char buffer[8]; ++static char buffer[14]; + char *p = buffer; + sprintf(p, "%d", n); + while (*p != 0) p++; +-- +2.4.3 + diff --git a/pcre-8.38-Fix-Q-E-before-qualifier-bug-when-auto-callouts-are-.patch b/pcre-8.38-Fix-Q-E-before-qualifier-bug-when-auto-callouts-are-.patch new file mode 100644 index 0000000..d001710 --- /dev/null +++ b/pcre-8.38-Fix-Q-E-before-qualifier-bug-when-auto-callouts-are-.patch @@ -0,0 +1,122 @@ +From e78ad4264b16988b826bd2939a1781c1165a92d9 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Mon, 30 Nov 2015 17:44:45 +0000 +Subject: [PATCH 5/5] Fix \Q\E before qualifier bug when auto callouts are + enabled. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1616 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcre_compile.c b/pcre_compile.c +index 5786cd3..beed46b 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -4671,17 +4671,27 @@ for (;; ptr++) + } + goto NORMAL_CHAR; + } ++ ++ /* Check for the start of a \Q...\E sequence. We must do this here rather ++ than later in case it is immediately followed by \E, which turns it into a ++ "do nothing" sequence. */ ++ ++ if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q) ++ { ++ inescq = TRUE; ++ ptr++; ++ continue; ++ } + } + +- /* In extended mode, skip white space and comments. We need a loop in order +- to check for more white space and more comments after a comment. */ ++ /* In extended mode, skip white space and comments. */ + + if ((options & PCRE_EXTENDED) != 0) + { +- for (;;) ++ const pcre_uchar *wscptr = ptr; ++ while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr); ++ if (c == CHAR_NUMBER_SIGN) + { +- while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr); +- if (c != CHAR_NUMBER_SIGN) break; + ptr++; + while (*ptr != CHAR_NULL) + { +@@ -4695,7 +4705,15 @@ for (;; ptr++) + if (utf) FORWARDCHAR(ptr); + #endif + } +- c = *ptr; /* Either NULL or the char after a newline */ ++ } ++ ++ /* If we skipped any characters, restart the loop. Otherwise, we didn't see ++ a comment. */ ++ ++ if (ptr > wscptr) ++ { ++ ptr--; ++ continue; + } + } + +@@ -7900,16 +7918,6 @@ for (;; ptr++) + c = ec; + else + { +- if (escape == ESC_Q) /* Handle start of quoted string */ +- { +- if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E) +- ptr += 2; /* avoid empty string */ +- else inescq = TRUE; +- continue; +- } +- +- if (escape == ESC_E) continue; /* Perl ignores an orphan \E */ +- + /* For metasequences that actually match a character, we disable the + setting of a first character if it hasn't already been set. */ + +diff --git a/testdata/testinput2 b/testdata/testinput2 +index e8ca4fe..3a1134f 100644 +--- a/testdata/testinput2 ++++ b/testdata/testinput2 +@@ -4227,4 +4227,6 @@ backtracking verbs. --/ + + /(A*)\E+/CBZ + ++/()\Q\E*]/BCZ ++ + /-- End of testinput2 --/ +diff --git a/testdata/testoutput2 b/testdata/testoutput2 +index 09756b8..ac33cc4 100644 +--- a/testdata/testoutput2 ++++ b/testdata/testoutput2 +@@ -14624,4 +14624,19 @@ No match + End + ------------------------------------------------------------------ + ++/()\Q\E*]/BCZ ++------------------------------------------------------------------ ++ Bra ++ Callout 255 0 7 ++ Brazero ++ SCBra 1 ++ Callout 255 1 0 ++ KetRmax ++ Callout 255 7 1 ++ ] ++ Callout 255 8 0 ++ Ket ++ End ++------------------------------------------------------------------ ++ + /-- End of testinput2 --/ +-- +2.4.3 + diff --git a/pcre-8.38-Fix-auto-callout-comment-bug.patch b/pcre-8.38-Fix-auto-callout-comment-bug.patch new file mode 100644 index 0000000..2a8f173 --- /dev/null +++ b/pcre-8.38-Fix-auto-callout-comment-bug.patch @@ -0,0 +1,169 @@ +From 3c80e02cd464ea049e117b423fd48fab294c51a9 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Thu, 26 Nov 2015 20:29:13 +0000 +Subject: [PATCH] Fix auto-callout (?# comment bug. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1611 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Pisar: Ported to 8.38. + +diff --git a/pcre_compile.c b/pcre_compile.c +index 4d3b313..3360a8b 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -4699,6 +4699,23 @@ for (;; ptr++) + } + } + ++ /* Skip over (?# comments. We need to do this here because we want to know if ++ the next thing is a quantifier, and these comments may come between an item ++ and its quantifier. */ ++ ++ if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK && ++ ptr[2] == CHAR_NUMBER_SIGN) ++ { ++ ptr += 3; ++ while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; ++ if (*ptr == CHAR_NULL) ++ { ++ *errorcodeptr = ERR18; ++ goto FAILED; ++ } ++ continue; ++ } ++ + /* See if the next thing is a quantifier. */ + + is_quantifier = +@@ -6529,21 +6546,6 @@ for (;; ptr++) + case CHAR_LEFT_PARENTHESIS: + ptr++; + +- /* First deal with comments. Putting this code right at the start ensures +- that comments have no bad side effects. */ +- +- if (ptr[0] == CHAR_QUESTION_MARK && ptr[1] == CHAR_NUMBER_SIGN) +- { +- ptr += 2; +- while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; +- if (*ptr == CHAR_NULL) +- { +- *errorcodeptr = ERR18; +- goto FAILED; +- } +- continue; +- } +- + /* Now deal with various "verbs" that can be introduced by '*'. */ + + if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':' +diff --git a/testdata/testinput2 b/testdata/testinput2 +index e2e520f..92e3359 100644 +--- a/testdata/testinput2 ++++ b/testdata/testinput2 +@@ -4217,4 +4217,12 @@ backtracking verbs. --/ + + /a[[:punct:]b]/BZ + ++/L(?#(|++ +Date: Fri, 27 Nov 2015 17:41:04 +0000 +Subject: [PATCH 2/5] Fix bug for isolated \E between an item and its qualifier + when auto callout is set. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1613 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcre_compile.c b/pcre_compile.c +index 3670f1e..5786cd3 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -4645,9 +4645,10 @@ for (;; ptr++) + goto FAILED; + } + +- /* If in \Q...\E, check for the end; if not, we have a literal */ ++ /* If in \Q...\E, check for the end; if not, we have a literal. Otherwise an ++ isolated \E is ignored. */ + +- if (inescq && c != CHAR_NULL) ++ if (c != CHAR_NULL) + { + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E) + { +@@ -4655,7 +4656,7 @@ for (;; ptr++) + ptr++; + continue; + } +- else ++ else if (inescq) + { + if (previous_callout != NULL) + { +@@ -4670,7 +4671,6 @@ for (;; ptr++) + } + goto NORMAL_CHAR; + } +- /* Control does not reach here. */ + } + + /* In extended mode, skip white space and comments. We need a loop in order +diff --git a/testdata/testinput2 b/testdata/testinput2 +index 92e3359..e8ca4fe 100644 +--- a/testdata/testinput2 ++++ b/testdata/testinput2 +@@ -4225,4 +4225,6 @@ backtracking verbs. --/ + + /L(?#(|++ +Date: Sat, 5 Dec 2015 16:58:46 +0000 +Subject: [PATCH] Fix (by hacking) another length computation issue. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1619 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcre_compile.c b/pcre_compile.c +index 57719b9..087bf2a 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -7280,7 +7280,7 @@ for (;; ptr++) + issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance + only mode, we finesse the bug by allowing more memory always. */ + +- *lengthptr += 2 + 2*LINK_SIZE; ++ *lengthptr += 4 + 4*LINK_SIZE; + + /* It is even worse than that. The current reference may be to an + existing named group with a different number (so apparently not +diff --git a/testdata/testoutput11-16 b/testdata/testoutput11-16 +index 9a0a12d..280692e 100644 +--- a/testdata/testoutput11-16 ++++ b/testdata/testoutput11-16 +@@ -231,7 +231,7 @@ Memory allocation (code space): 73 + ------------------------------------------------------------------ + + /(?Pa)...(?P=a)bbb(?P>a)d/BM +-Memory allocation (code space): 77 ++Memory allocation (code space): 93 + ------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 +diff --git a/testdata/testoutput11-32 b/testdata/testoutput11-32 +index 57e5da0..cdbda74 100644 +--- a/testdata/testoutput11-32 ++++ b/testdata/testoutput11-32 +@@ -231,7 +231,7 @@ Memory allocation (code space): 155 + ------------------------------------------------------------------ + + /(?Pa)...(?P=a)bbb(?P>a)d/BM +-Memory allocation (code space): 157 ++Memory allocation (code space): 189 + ------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 +diff --git a/testdata/testoutput11-8 b/testdata/testoutput11-8 +index 748548a..cb37896 100644 +--- a/testdata/testoutput11-8 ++++ b/testdata/testoutput11-8 +@@ -231,7 +231,7 @@ Memory allocation (code space): 45 + ------------------------------------------------------------------ + + /(?Pa)...(?P=a)bbb(?P>a)d/BM +-Memory allocation (code space): 50 ++Memory allocation (code space): 62 + ------------------------------------------------------------------ + 0 30 Bra + 3 7 CBra 1 +-- +2.4.3 + diff --git a/pcre-8.38-Fix-copy-named-substring-bug.patch b/pcre-8.38-Fix-copy-named-substring-bug.patch new file mode 100644 index 0000000..301344b --- /dev/null +++ b/pcre-8.38-Fix-copy-named-substring-bug.patch @@ -0,0 +1,99 @@ +From db1fb68feddc9afe6f8822d099fa9ff25e3ea8e7 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Sat, 5 Dec 2015 16:30:14 +0000 +Subject: [PATCH] Fix copy named substring bug. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1618 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. +diff --git a/pcre_get.c b/pcre_get.c +index 8094b34..41eda9c 100644 +--- a/pcre_get.c ++++ b/pcre_get.c +@@ -250,6 +250,7 @@ Arguments: + code the compiled regex + stringname the name of the capturing substring + ovector the vector of matched substrings ++ stringcount number of captured substrings + + Returns: the number of the first that is set, + or the number of the last one if none are set, +@@ -258,13 +259,16 @@ Returns: the number of the first that is set, + + #if defined COMPILE_PCRE8 + static int +-get_first_set(const pcre *code, const char *stringname, int *ovector) ++get_first_set(const pcre *code, const char *stringname, int *ovector, ++ int stringcount) + #elif defined COMPILE_PCRE16 + static int +-get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector) ++get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector, ++ int stringcount) + #elif defined COMPILE_PCRE32 + static int +-get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector) ++get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector, ++ int stringcount) + #endif + { + const REAL_PCRE *re = (const REAL_PCRE *)code; +@@ -295,7 +299,7 @@ if (entrysize <= 0) return entrysize; + for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) + { + int n = GET2(entry, 0); +- if (ovector[n*2] >= 0) return n; ++ if (n < stringcount && ovector[n*2] >= 0) return n; + } + return GET2(entry, 0); + } +@@ -402,7 +406,7 @@ pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject, + PCRE_UCHAR32 *buffer, int size) + #endif + { +-int n = get_first_set(code, stringname, ovector); ++int n = get_first_set(code, stringname, ovector, stringcount); + if (n <= 0) return n; + #if defined COMPILE_PCRE8 + return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); +@@ -619,7 +623,7 @@ pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject, + PCRE_SPTR32 *stringptr) + #endif + { +-int n = get_first_set(code, stringname, ovector); ++int n = get_first_set(code, stringname, ovector, stringcount); + if (n <= 0) return n; + #if defined COMPILE_PCRE8 + return pcre_get_substring(subject, ovector, stringcount, n, stringptr); +diff --git a/testdata/testinput2 b/testdata/testinput2 +index 3a1134f..00ffe32 100644 +--- a/testdata/testinput2 ++++ b/testdata/testinput2 +@@ -4229,4 +4229,7 @@ backtracking verbs. --/ + + /()\Q\E*]/BCZ + ++/(?)(?J:(?)(?))(?)/ ++ \O\CC ++ + /-- End of testinput2 --/ +diff --git a/testdata/testoutput2 b/testdata/testoutput2 +index 6c42897..ffb4466 100644 +--- a/testdata/testoutput2 ++++ b/testdata/testoutput2 +@@ -14639,4 +14639,9 @@ No match + End + ------------------------------------------------------------------ + ++/(?)(?J:(?)(?))(?)/ ++ \O\CC ++Matched, but too many substrings ++copy substring C failed -7 ++ + /-- End of testinput2 --/ +-- +2.4.3 + diff --git a/pcre-8.38-Fix-get_substring_list-bug-when-K-is-used-in-an-asse.patch b/pcre-8.38-Fix-get_substring_list-bug-when-K-is-used-in-an-asse.patch new file mode 100644 index 0000000..4c9ec8a --- /dev/null +++ b/pcre-8.38-Fix-get_substring_list-bug-when-K-is-used-in-an-asse.patch @@ -0,0 +1,67 @@ +From 4f47274a2eb10131d88145ad7fd0eed4027a0c51 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Tue, 8 Dec 2015 11:06:40 +0000 +Subject: [PATCH] Fix get_substring_list() bug when \K is used in an assertion. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1620 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: ported to 8.38. + +diff --git a/pcre_get.c b/pcre_get.c +index 41eda9c..cdd2abc 100644 +--- a/pcre_get.c ++++ b/pcre_get.c +@@ -461,7 +461,10 @@ pcre_uchar **stringlist; + pcre_uchar *p; + + for (i = 0; i < double_count; i += 2) +- size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1); ++ { ++ size += sizeof(pcre_uchar *) + IN_UCHARS(1); ++ if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]); ++ } + + stringlist = (pcre_uchar **)(PUBL(malloc))(size); + if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; +@@ -477,7 +480,7 @@ p = (pcre_uchar *)(stringlist + stringcount + 1); + + for (i = 0; i < double_count; i += 2) + { +- int len = ovector[i+1] - ovector[i]; ++ int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0; + memcpy(p, subject + ovector[i], IN_UCHARS(len)); + *stringlist++ = p; + p += len; +diff --git a/testdata/testinput2 b/testdata/testinput2 +index 00ffe32..967a241 100644 +--- a/testdata/testinput2 ++++ b/testdata/testinput2 +@@ -4232,4 +4232,7 @@ backtracking verbs. --/ + /(?)(?J:(?)(?))(?)/ + \O\CC + ++/(?=a\K)/ ++ ring bpattingbobnd $ 1,oern cou \rb\L ++ + /-- End of testinput2 --/ +diff --git a/testdata/testoutput2 b/testdata/testoutput2 +index ffb4466..5fb28d5 100644 +--- a/testdata/testoutput2 ++++ b/testdata/testoutput2 +@@ -14644,4 +14644,10 @@ No match + Matched, but too many substrings + copy substring C failed -7 + ++/(?=a\K)/ ++ ring bpattingbobnd $ 1,oern cou \rb\L ++Start of matched string is beyond its end - displaying from end to start. ++ 0: a ++ 0L ++ + /-- End of testinput2 --/ +-- +2.5.0 + diff --git a/pcre-8.38-Fix-negated-POSIX-class-within-negated-overall-class.patch b/pcre-8.38-Fix-negated-POSIX-class-within-negated-overall-class.patch new file mode 100644 index 0000000..65ccd00 --- /dev/null +++ b/pcre-8.38-Fix-negated-POSIX-class-within-negated-overall-class.patch @@ -0,0 +1,94 @@ +From ef6b10fcde41a2687f38d4a9ff2886b037948a1b Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Fri, 27 Nov 2015 17:13:13 +0000 +Subject: [PATCH 1/5] Fix negated POSIX class within negated overall class UCP + bug. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1612 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. +diff --git a/pcre_compile.c b/pcre_compile.c +index 3360a8b..3670f1e 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -5063,20 +5063,22 @@ for (;; ptr++) + ptr = tempptr + 1; + continue; + +- /* For the other POSIX classes (ascii, xdigit) we are going to fall +- through to the non-UCP case and build a bit map for characters with +- code points less than 256. If we are in a negated POSIX class +- within a non-negated overall class, characters with code points +- greater than 255 must all match. In the special case where we have +- not yet generated any xclass data, and this is the final item in +- the overall class, we need do nothing: later on, the opcode ++ /* For the other POSIX classes (ascii, cntrl, xdigit) we are going ++ to fall through to the non-UCP case and build a bit map for ++ characters with code points less than 256. If we are in a negated ++ POSIX class, characters with code points greater than 255 must ++ either all match or all not match. In the special case where we ++ have not yet generated any xclass data, and this is the final item ++ in the overall class, we need do nothing: later on, the opcode + OP_NCLASS will be used to indicate that characters greater than 255 + are acceptable. If we have already seen an xclass item or one may + follow (we have to assume that it might if this is not the end of +- the class), explicitly match all wide codepoints. */ ++ the class), explicitly list all wide codepoints, which will then ++ either not match or match, depending on whether the class is or is ++ not negated. */ + + default: +- if (!negate_class && local_negate && ++ if (local_negate && + (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET)) + { + *class_uchardata++ = XCL_RANGE; +diff --git a/testdata/testinput6 b/testdata/testinput6 +index aeb62a0..a178d3d 100644 +--- a/testdata/testinput6 ++++ b/testdata/testinput6 +@@ -1553,4 +1553,13 @@ + \x{200} + \x{37e} + ++/[^[:^ascii:]\d]/8W ++ a ++ ~ ++ 0 ++ \a ++ \x{7f} ++ \x{389} ++ \x{20ac} ++ + /-- End of testinput6 --/ +diff --git a/testdata/testoutput6 b/testdata/testoutput6 +index beb85aa..b64dc0d 100644 +--- a/testdata/testoutput6 ++++ b/testdata/testoutput6 +@@ -2557,4 +2557,20 @@ No match + \x{37e} + 0: \x{37e} + ++/[^[:^ascii:]\d]/8W ++ a ++ 0: a ++ ~ ++ 0: ~ ++ 0 ++No match ++ \a ++ 0: \x{07} ++ \x{7f} ++ 0: \x{7f} ++ \x{389} ++No match ++ \x{20ac} ++No match ++ + /-- End of testinput6 --/ +-- +2.4.3 + diff --git a/pcre-8.38-Fix-x-bug-when-pattern-starts-with-white-space-and-x.patch b/pcre-8.38-Fix-x-bug-when-pattern-starts-with-white-space-and-x.patch new file mode 100644 index 0000000..4a2c3dc --- /dev/null +++ b/pcre-8.38-Fix-x-bug-when-pattern-starts-with-white-space-and-x.patch @@ -0,0 +1,193 @@ +From 46ed1a703b067e5b679eacf6500a54dae35f8130 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Thu, 3 Dec 2015 17:05:40 +0000 +Subject: [PATCH] Fix /x bug when pattern starts with white space and (?-x) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1617 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcre_compile.c b/pcre_compile.c +index beed46b..57719b9 100644 +--- a/pcre_compile.c ++++ b/pcre_compile.c +@@ -7607,39 +7607,15 @@ for (;; ptr++) + newoptions = (options | set) & (~unset); + + /* If the options ended with ')' this is not the start of a nested +- group with option changes, so the options change at this level. If this +- item is right at the start of the pattern, the options can be +- abstracted and made external in the pre-compile phase, and ignored in +- the compile phase. This can be helpful when matching -- for instance in +- caseless checking of required bytes. +- +- If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are +- definitely *not* at the start of the pattern because something has been +- compiled. In the pre-compile phase, however, the code pointer can have +- that value after the start, because it gets reset as code is discarded +- during the pre-compile. However, this can happen only at top level - if +- we are within parentheses, the starting BRA will still be present. At +- any parenthesis level, the length value can be used to test if anything +- has been compiled at that level. Thus, a test for both these conditions +- is necessary to ensure we correctly detect the start of the pattern in +- both phases. +- ++ group with option changes, so the options change at this level. + If we are not at the pattern start, reset the greedy defaults and the + case value for firstchar and reqchar. */ + + if (*ptr == CHAR_RIGHT_PARENTHESIS) + { +- if (code == cd->start_code + 1 + LINK_SIZE && +- (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE)) +- { +- cd->external_options = newoptions; +- } +- else +- { +- greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); +- greedy_non_default = greedy_default ^ 1; +- req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0; +- } ++ greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); ++ greedy_non_default = greedy_default ^ 1; ++ req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0; + + /* Change options at this level, and pass them back for use + in subsequent branches. */ +diff --git a/testdata/testoutput2 b/testdata/testoutput2 +index ac33cc4..6c42897 100644 +--- a/testdata/testoutput2 ++++ b/testdata/testoutput2 +@@ -419,7 +419,7 @@ Need char = '>' + + /(?U)<.*>/I + Capturing subpattern count = 0 +-Options: ungreedy ++No options + First char = '<' + Need char = '>' + abcghinop +@@ -443,7 +443,7 @@ Need char = '=' + + /(?U)={3,}?/I + Capturing subpattern count = 0 +-Options: ungreedy ++No options + First char = '=' + Need char = '=' + abc========def +@@ -477,7 +477,7 @@ Failed: lookbehind assertion is not fixed length at offset 12 + + /(?i)abc/I + Capturing subpattern count = 0 +-Options: caseless ++No options + First char = 'a' (caseless) + Need char = 'c' (caseless) + +@@ -489,7 +489,7 @@ No need char + + /(?i)^1234/I + Capturing subpattern count = 0 +-Options: anchored caseless ++Options: anchored + No first char + No need char + +@@ -502,7 +502,7 @@ No need char + /(?s).*/I + Capturing subpattern count = 0 + May match empty string +-Options: anchored dotall ++Options: anchored + No first char + No need char + +@@ -516,7 +516,7 @@ Starting chars: a b c d + + /(?i)[abcd]/IS + Capturing subpattern count = 0 +-Options: caseless ++No options + No first char + No need char + Subject length lower bound = 1 +@@ -524,7 +524,7 @@ Starting chars: A B C D a b c d + + /(?m)[xy]|(b|c)/IS + Capturing subpattern count = 1 +-Options: multiline ++No options + No first char + No need char + Subject length lower bound = 1 +@@ -538,7 +538,7 @@ No need char + + /(?i)(^a|^b)/Im + Capturing subpattern count = 1 +-Options: caseless multiline ++Options: multiline + First char at start or follows newline + No need char + +@@ -1179,7 +1179,7 @@ No need char + End + ------------------------------------------------------------------ + Capturing subpattern count = 1 +-Options: anchored dotall ++Options: anchored + No first char + No need char + +@@ -2735,7 +2735,7 @@ No match + End + ------------------------------------------------------------------ + Capturing subpattern count = 0 +-Options: caseless extended ++Options: extended + First char = 'a' (caseless) + Need char = 'c' (caseless) + +@@ -2748,7 +2748,7 @@ Need char = 'c' (caseless) + End + ------------------------------------------------------------------ + Capturing subpattern count = 0 +-Options: caseless extended ++Options: extended + First char = 'a' (caseless) + Need char = 'c' (caseless) + +@@ -3095,7 +3095,7 @@ Need char = 'b' + End + ------------------------------------------------------------------ + Capturing subpattern count = 0 +-Options: ungreedy ++No options + First char = 'x' + Need char = 'b' + xaaaab +@@ -3497,7 +3497,7 @@ Need char = 'c' + + /(?i)[ab]/IS + Capturing subpattern count = 0 +-Options: caseless ++No options + No first char + No need char + Subject length lower bound = 1 +@@ -6299,7 +6299,7 @@ Capturing subpattern count = 3 + Named capturing subpatterns: + A 2 + A 3 +-Options: anchored dupnames ++Options: anchored + Duplicate name status changes + No first char + No need char +-- +2.4.3 + diff --git a/pcre-8.38-Give-error-for-regexec-with-pmatch-NULL-and-REG_STAR.patch b/pcre-8.38-Give-error-for-regexec-with-pmatch-NULL-and-REG_STAR.patch new file mode 100644 index 0000000..3f8a448 --- /dev/null +++ b/pcre-8.38-Give-error-for-regexec-with-pmatch-NULL-and-REG_STAR.patch @@ -0,0 +1,28 @@ +From 108377b836fc29a84f5286287629d96549b1c777 Mon Sep 17 00:00:00 2001 +From: ph10 +Date: Sun, 29 Nov 2015 17:38:25 +0000 +Subject: [PATCH 3/5] Give error for regexec with pmatch=NULL and REG_STARTEND + set. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1614 2f5784b3-3f2a-0410-8824-cb99058d5e15 + +Petr Písař: Ported to 8.38. + +diff --git a/pcreposix.c b/pcreposix.c +index f024423..dcc13ef 100644 +--- a/pcreposix.c ++++ b/pcreposix.c +@@ -364,6 +364,7 @@ start location rather than being passed as a PCRE "starting offset". */ + + if ((eflags & REG_STARTEND) != 0) + { ++ if (pmatch == NULL) return REG_INVARG; + so = pmatch[0].rm_so; + eo = pmatch[0].rm_eo; + } +-- +2.4.3 + diff --git a/sources b/sources index a5fed82..6ea783c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -b767bc9af0c20bc9c1fe403b0d41ad97 pcre-8.36.tar.bz2 +00aabbfe56d5a48b270f999b508c5ad2 pcre-8.38.tar.bz2