[mingw-pcre/f21] Update to 8.35 and add upstream patches

Yaakov Selkowitz yselkowitz at fedoraproject.org
Thu Dec 25 21:56:30 UTC 2014


commit cb693738d6bcbf69cd97048d8f3a42f734616427
Author: Yaakov Selkowitz <yselkowi at redhat.com>
Date:   Thu Dec 25 13:48:14 2014 -0600

    Update to 8.35 and add upstream patches
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1177278

 .gitignore                                         |    1 +
 mingw-pcre.spec                                    |   51 +++++-
 ...-on-wrapping-signed-integer-while-parsein.patch |   64 ++++++
 ...-compile-of-Qx-.-where-x-is-any-character.patch |   61 ++++++
 ...rting-data-when-char-with-more-than-one-o.patch |   85 ++++++++
 ...n-there-are-unset-groups-prior-to-ACCEPT-.patch |   78 +++++++
 ...-time-loop-for-recursive-reference-within.patch |  100 +++++++++
 ...r-crash-misbehaviour-for-zero-repeated-gr.patch |  197 ++++++++++++++++++
 ...atching-possessive-zero-repeat-groups-bug.patch |  192 +++++++++++++++++
 ...including-VT-in-starting-characters-for-s.patch |  217 ++++++++++++++++++++
 ...5-Fix-zero-repeat-assertion-condition-bug.patch |   75 +++++++
 ...35-Fixed-several-memory-leaks-in-pcregrep.patch |  127 ++++++++++++
 sources                                            |    2 +-
 13 files changed, 1246 insertions(+), 4 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 3e37b73..5ac2f07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 /pcre-8.32.tar.gz
 /pcre-8.33.tar.gz
 /pcre-8.34.tar.gz
+/pcre-8.35.tar.bz2
diff --git a/mingw-pcre.spec b/mingw-pcre.spec
index e3092ae..00d1579 100644
--- a/mingw-pcre.spec
+++ b/mingw-pcre.spec
@@ -1,14 +1,45 @@
 %?mingw_package_header
 
 Name:		mingw-pcre
-Version:	8.34
-Release:	2%{?dist}
+Version:	8.35
+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.gz
+Source0:	ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-%{version}.tar.bz2
+# Do no rely on wrapping signed integer while parsing {min,max} expression,
+# bug #1086630, upstream bug #1463
+Patch2: pcre-8.35-Do-not-rely-on-wrapping-signed-integer-while-parsein.patch
+# Fix bad starting data when char with more than one other case follows
+# circumflex in multiline UTF mode, bug #1110620, upstream bug #1492,
+# in upstream after 8.35
+Patch3: pcre-8.35-Fix-bad-starting-data-when-char-with-more-than-one-o.patch
+# Fix not including VT in starting characters for \s if pcre_study() is used,
+# bug #1111045, upstream bug #1493, in upstream after 8.35
+Patch4: pcre-8.35-Fix-not-including-VT-in-starting-characters-for-s.patch
+# Fix character class with a literal quotation, bug #1111054,
+# upstream bug #1494, in upstream after 8.35
+Patch5: pcre-8.35-Fix-bad-compile-of-Qx-.-where-x-is-any-character.patch
+# Fix empty-matching possessive zero-repeat groups in interpreted mode,
+# bug #1119241, upstream bug #1500, in upstream after 8.35
+Patch6: pcre-8.35-Fix-empty-matching-possessive-zero-repeat-groups-bug.patch
+# Fix memory leaks in pcregrep, bug #1119257, upstream bug #1502,
+# in upstream after 8.35
+Patch7: pcre-8.35-Fixed-several-memory-leaks-in-pcregrep.patch
+# Fix compiler crash for zero-repeated groups with a recursive back reference,
+# bug #1119272, upstream bug #1503, in upstream after 8.35
+Patch8: pcre-8.35-Fix-compiler-crash-misbehaviour-for-zero-repeated-gr.patch
+# Fix compile-time loop for recursive reference within a group with an
+# indefinite repeat, bug #1128577, upstream bug #1515, in upstream after 8.35
+Patch9: pcre-8.35-Fix-compile-time-loop-for-recursive-reference-within.patch
+# Reset non-matched groups within capturing group up to forced match,
+# bug #1161587, in upstream after 8.36
+Patch10: pcre-8.35-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
+Patch11: pcre-8.35-Fix-zero-repeat-assertion-condition-bug.patch
 
 BuildArch:	noarch
 
@@ -85,6 +116,16 @@ Static version of the mingw64-pcre library.
 
 %prep
 %setup -q -n pcre-%{version}
+%patch2 -p1 -b .gcc49
+%patch3 -p1 -b .starting_data
+%patch4 -p1 -b .studied_vt
+%patch5 -p1 -b .class_with_literal
+%patch6 -p1 -b .empty_zero_repeat_group
+%patch7 -p1 -b .pcregrep_leak
+%patch8 -p1 -b .compiler_crash_zero_group
+%patch9 -p1 -b .compiler_loop_recursive_reference
+%patch10 -p1 -b .reset_groups
+%patch11 -p1 -b .zero_repeat_assertion
 
 
 %build
@@ -176,6 +217,10 @@ find $RPM_BUILD_ROOT -name "*.la" -delete
 
 
 %changelog
+* Thu Dec 25 2014 Yaakov Selkowitz <yselkowi at redhat.com> - 8.35-1
+- Update to 8.35
+- Add upstream patches from main pcre package
+
 * Sat Jun 07 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 8.34-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
 
diff --git a/pcre-8.35-Do-not-rely-on-wrapping-signed-integer-while-parsein.patch b/pcre-8.35-Do-not-rely-on-wrapping-signed-integer-while-parsein.patch
new file mode 100644
index 0000000..ea0d39e
--- /dev/null
+++ b/pcre-8.35-Do-not-rely-on-wrapping-signed-integer-while-parsein.patch
@@ -0,0 +1,64 @@
+From a05e11ff3a663c06e0a30dfa86aa7ed4544a6008 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar at redhat.com>
+Date: Fri, 11 Apr 2014 13:41:13 +0200
+Subject: [PATCH] Do not rely on wrapping signed integer while parseing
+ {min,max}
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed integer overflow is not defined in C language. GCC 4.9 bails
+out here.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ pcre_compile.c | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/pcre_compile.c b/pcre_compile.c
+index 8a5b723..ce65058 100644
+--- a/pcre_compile.c
++++ b/pcre_compile.c
+@@ -1586,11 +1586,15 @@ int max = -1;
+ /* Read the minimum value and do a paranoid check: a negative value indicates
+ an integer overflow. */
+ 
+-while (IS_DIGIT(*p)) min = min * 10 + (int)(*p++ - CHAR_0);
+-if (min < 0 || min > 65535)
++while (IS_DIGIT(*p))
+   {
+-  *errorcodeptr = ERR5;
+-  return p;
++  min = min * 10 + (int)(*p++ - CHAR_0);
++  if (min > 65535)
++    {
++    *errorcodeptr = ERR5;
++    while (*p != CHAR_RIGHT_CURLY_BRACKET) p++;
++    return p;
++    }
+   }
+ 
+ /* Read the maximum value if there is one, and again do a paranoid on its size.
+@@ -1601,11 +1605,15 @@ if (*p == CHAR_RIGHT_CURLY_BRACKET) max = min; else
+   if (*(++p) != CHAR_RIGHT_CURLY_BRACKET)
+     {
+     max = 0;
+-    while(IS_DIGIT(*p)) max = max * 10 + (int)(*p++ - CHAR_0);
+-    if (max < 0 || max > 65535)
++    while(IS_DIGIT(*p))
+       {
+-      *errorcodeptr = ERR5;
+-      return p;
++      max = max * 10 + (int)(*p++ - CHAR_0);
++      if (max > 65535)
++        {
++        *errorcodeptr = ERR5;
++        while (*p != CHAR_RIGHT_CURLY_BRACKET) p++;
++        return p;
++        }
+       }
+     if (max < min)
+       {
+-- 
+1.9.0
+
diff --git a/pcre-8.35-Fix-bad-compile-of-Qx-.-where-x-is-any-character.patch b/pcre-8.35-Fix-bad-compile-of-Qx-.-where-x-is-any-character.patch
new file mode 100644
index 0000000..3717c0f
--- /dev/null
+++ b/pcre-8.35-Fix-bad-compile-of-Qx-.-where-x-is-any-character.patch
@@ -0,0 +1,61 @@
+From 8d8c3dbadff3d0735ba696acf211c14b3025622f Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Wed, 18 Jun 2014 17:17:03 +0000
+Subject: [PATCH] Fix bad compile of [\Qx]...  where x is any character.
+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@1487 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+diff --git a/pcre_compile.c b/pcre_compile.c
+index 29d3c29..c44839e 100644
+--- a/pcre_compile.c
++++ b/pcre_compile.c
+@@ -5325,7 +5325,7 @@ for (;; ptr++)
+       whatever repeat count may follow. In the case of reqchar, save the
+       previous value for reinstating. */
+ 
+-      if (class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
++      if (!inescq && class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
+         {
+         ptr++;
+         zeroreqchar = reqchar;
+diff --git a/testdata/testinput1 b/testdata/testinput1
+index c9ebf9f..5513d16 100644
+--- a/testdata/testinput1
++++ b/testdata/testinput1
+@@ -5708,4 +5708,10 @@ AbcdCBefgBhiBqz
+ /\sabc/
+     \x{0b}abc
+ 
++/[\Qa]\E]+/
++    aa]]
++
++/[\Q]a\E]+/
++    aa]]
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testoutput1 b/testdata/testoutput1
+index 6eb7d2d..cfa90d6 100644
+--- a/testdata/testoutput1
++++ b/testdata/testoutput1
+@@ -9393,4 +9393,12 @@ No match
+     \x{0b}abc
+  0: \x0babc
+ 
++/[\Qa]\E]+/
++    aa]]
++ 0: aa]]
++
++/[\Q]a\E]+/
++    aa]]
++ 0: aa]]
++
+ /-- End of testinput1 --/
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-bad-starting-data-when-char-with-more-than-one-o.patch b/pcre-8.35-Fix-bad-starting-data-when-char-with-more-than-one-o.patch
new file mode 100644
index 0000000..cc810c4
--- /dev/null
+++ b/pcre-8.35-Fix-bad-starting-data-when-char-with-more-than-one-o.patch
@@ -0,0 +1,85 @@
+From 35f4457ba4dadc0839df9275adf1fd14e15c28fa Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Wed, 18 Jun 2014 16:31:32 +0000
+Subject: [PATCH] Fix bad starting data when char with more than one other case
+ follows circumflex in multiline UTF mode.
+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@1485 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+diff --git a/pcre_compile.c b/pcre_compile.c
+index 0cf05b9..29d3c29 100644
+--- a/pcre_compile.c
++++ b/pcre_compile.c
+@@ -4694,7 +4694,8 @@ for (;; ptr++)
+     previous = NULL;
+     if ((options & PCRE_MULTILINE) != 0)
+       {
+-      if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
++      if (firstcharflags == REQ_UNSET) 
++        zerofirstcharflags = firstcharflags = REQ_NONE;
+       *code++ = OP_CIRCM;
+       }
+     else *code++ = OP_CIRC;
+diff --git a/testdata/testinput6 b/testdata/testinput6
+index 7a6a53f..7aebba0 100644
+--- a/testdata/testinput6
++++ b/testdata/testinput6
+@@ -1493,4 +1493,7 @@
+ /[q-u]+/8iW 
+     Ss\x{17f}
+ 
++/^s?c/mi8
++    scat
++
+ /-- End of testinput6 --/
+diff --git a/testdata/testinput7 b/testdata/testinput7
+index 6bd0586..7a66025 100644
+--- a/testdata/testinput7
++++ b/testdata/testinput7
+@@ -835,4 +835,7 @@ of case for anything other than the ASCII letters. --/
+ 
+ /[Q-U]+/8iWBZ 
+ 
++/^s?c/mi8I
++    scat
++
+ /-- End of testinput7 --/
+diff --git a/testdata/testoutput6 b/testdata/testoutput6
+index f355e60..65bf78f 100644
+--- a/testdata/testoutput6
++++ b/testdata/testoutput6
+@@ -2457,4 +2457,8 @@ No match
+     Ss\x{17f}
+  0: Ss\x{17f}
+ 
++/^s?c/mi8
++    scat
++ 0: sc
++
+ /-- End of testinput6 --/
+diff --git a/testdata/testoutput7 b/testdata/testoutput7
+index c64e049..ee46bdb 100644
+--- a/testdata/testoutput7
++++ b/testdata/testoutput7
+@@ -2287,4 +2287,12 @@ No match
+         End
+ ------------------------------------------------------------------
+ 
++/^s?c/mi8I
++Capturing subpattern count = 0
++Options: caseless multiline utf
++First char at start or follows newline
++Need char = 'c' (caseless)
++    scat
++ 0: sc
++
+ /-- End of testinput7 --/
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch b/pcre-8.35-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch
new file mode 100644
index 0000000..6d5f15f
--- /dev/null
+++ b/pcre-8.35-Fix-bug-when-there-are-unset-groups-prior-to-ACCEPT-.patch
@@ -0,0 +1,78 @@
+From acdd8fc2e9995d0f67625d03a5a903f76c5d68a7 Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+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ř <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ pcre_exec.c          | 13 ++++++++++++-
+ testdata/testinput1  |  3 +++
+ testdata/testoutput1 |  9 +++++++++
+ 3 files changed, 24 insertions(+), 1 deletion(-)
+
+diff --git a/pcre_exec.c b/pcre_exec.c
+index 5a8dbad..0227740 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 4a7a015..e1d9b5c 100644
+--- a/testdata/testinput1
++++ b/testdata/testinput1
+@@ -5690,4 +5690,7 @@ AbcdCBefgBhiBqz
+ '\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++'
+     NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
+ 
++/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
++    1234abcd
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testoutput1 b/testdata/testoutput1
+index 6710f42..11374ce 100644
+--- a/testdata/testoutput1
++++ b/testdata/testoutput1
+@@ -9347,4 +9347,13 @@ No match
+     NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
+  0: NON QUOTED "QUOT""ED" AFTER 
+ 
++/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
++    1234abcd
++ 0: 
++ 1: <unset>
++ 2: <unset>
++ 3: <unset>
++ 4: <unset>
++ 5: 
++
+ /-- End of testinput1 --/
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-compile-time-loop-for-recursive-reference-within.patch b/pcre-8.35-Fix-compile-time-loop-for-recursive-reference-within.patch
new file mode 100644
index 0000000..900ff5e
--- /dev/null
+++ b/pcre-8.35-Fix-compile-time-loop-for-recursive-reference-within.patch
@@ -0,0 +1,100 @@
+From fd411b0b71fc1d0bd1977d0a86e5711599f875d8 Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Fri, 8 Aug 2014 15:22:51 +0000
+Subject: [PATCH] Fix compile-time loop for recursive reference within a group
+ with an indefinite repeat.
+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@1498 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+diff --git a/pcre_compile.c b/pcre_compile.c
+index 8276d0f..4bb05b9 100644
+--- a/pcre_compile.c
++++ b/pcre_compile.c
+@@ -2374,6 +2374,7 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);
+   if (c == OP_RECURSE)
+     {
+     const pcre_uchar *scode = cd->start_code + GET(code, 1);
++    const pcre_uchar *endgroup = scode;
+     BOOL empty_branch;
+ 
+     /* Test for forward reference or uncompleted reference. This is disabled
+@@ -2388,24 +2389,20 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);
+       if (GET(scode, 1) == 0) return TRUE;    /* Unclosed */
+       }
+ 
+-    /* If we are scanning a completed pattern, there are no forward references
+-    and all groups are complete. We need to detect whether this is a recursive
+-    call, as otherwise there will be an infinite loop. If it is a recursion,
+-    just skip over it. Simple recursions are easily detected. For mutual
+-    recursions we keep a chain on the stack. */
++    /* If the reference is to a completed group, we need to detect whether this
++    is a recursive call, as otherwise there will be an infinite loop. If it is
++    a recursion, just skip over it. Simple recursions are easily detected. For
++    mutual recursions we keep a chain on the stack. */
+ 
++    do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT);
++    if (code >= scode && code <= endgroup) continue;  /* Simple recursion */
+     else
+-      {
++      {  
+       recurse_check *r = recurses;
+-      const pcre_uchar *endgroup = scode;
+-
+-      do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT);
+-      if (code >= scode && code <= endgroup) continue;  /* Simple recursion */
+-
+       for (r = recurses; r != NULL; r = r->prev)
+         if (r->group == scode) break;
+       if (r != NULL) continue;   /* Mutual recursion */
+-      }
++      } 
+ 
+     /* Completed reference; scan the referenced group, remembering it on the
+     stack chain to detect mutual recursions. */
+diff --git a/testdata/testinput1 b/testdata/testinput1
+index 6fd62ba..123e3d3 100644
+--- a/testdata/testinput1
++++ b/testdata/testinput1
+@@ -4937,6 +4937,12 @@ however, we need the complication for Perl. ---/
+ 
+ /((?(R1)a+|(?1)b))/
+     aaaabcde
++    
++/((?(R)a|(?1)))*/
++    aaa
++
++/((?(R)a|(?1)))+/
++    aaa
+ 
+ /a(*:any 
+ name)/K
+diff --git a/testdata/testoutput1 b/testdata/testoutput1
+index eeddf0f..5e71900 100644
+--- a/testdata/testoutput1
++++ b/testdata/testoutput1
+@@ -8234,6 +8234,16 @@ MK: M
+     aaaabcde
+  0: aaaab
+  1: aaaab
++    
++/((?(R)a|(?1)))*/
++    aaa
++ 0: aaa
++ 1: a
++
++/((?(R)a|(?1)))+/
++    aaa
++ 0: aaa
++ 1: a
+ 
+ /a(*:any 
+ name)/K
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-compiler-crash-misbehaviour-for-zero-repeated-gr.patch b/pcre-8.35-Fix-compiler-crash-misbehaviour-for-zero-repeated-gr.patch
new file mode 100644
index 0000000..aa481ad
--- /dev/null
+++ b/pcre-8.35-Fix-compiler-crash-misbehaviour-for-zero-repeated-gr.patch
@@ -0,0 +1,197 @@
+From d35a6c663d37e072f4a5440f281f62aa6dc42418 Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Sat, 12 Jul 2014 18:22:54 +0000
+Subject: [PATCH] Fix compiler crash/misbehaviour for zero-repeated groups that
+ include a recursive back reference.
+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@1495 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+diff --git a/pcre_compile.c b/pcre_compile.c
+index 85d0e94..8276d0f 100644
+--- a/pcre_compile.c
++++ b/pcre_compile.c
+@@ -8267,12 +8267,16 @@ for (;;)
+ 
+     /* If it was a capturing subpattern, check to see if it contained any
+     recursive back references. If so, we must wrap it in atomic brackets.
+-    In any event, remove the block from the chain. */
++    Because we are moving code along, we must ensure that any pending recursive
++    references are updated. In any event, remove the block from the chain. */
+ 
+     if (capnumber > 0)
+       {
+       if (cd->open_caps->flag)
+         {
++        *code = OP_END;
++        adjust_recurse(start_bracket, 1 + LINK_SIZE,
++          (options & PCRE_UTF8) != 0, cd, cd->hwm);
+         memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
+           IN_UCHARS(code - start_bracket));
+         *start_bracket = OP_ONCE;
+diff --git a/testdata/testinput11 b/testdata/testinput11
+index 391ada7..7e8e542 100644
+--- a/testdata/testinput11
++++ b/testdata/testinput11
+@@ -132,4 +132,6 @@ is required for these tests. --/
+ 
+ /abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+ 
++/(((a\2)|(a*)\g<-1>))*a?/B
++
+ /-- End of testinput11 --/
+diff --git a/testdata/testinput2 b/testdata/testinput2
+index 81be076..c6816bf 100644
+--- a/testdata/testinput2
++++ b/testdata/testinput2
+@@ -4035,6 +4035,8 @@ backtracking verbs. --/
+ 
+ /(?(R&6yh)abc)/
+ 
++/(((a\2)|(a*)\g<-1>))*a?/BZ
++
+ /-- Test the ugly "start or end of word" compatibility syntax --/
+ 
+ /[[:<:]]red[[:>:]]/BZ
+diff --git a/testdata/testoutput11-16 b/testdata/testoutput11-16
+index f1ad888..a1db3f3 100644
+--- a/testdata/testoutput11-16
++++ b/testdata/testoutput11-16
+@@ -709,4 +709,28 @@ Memory allocation (code space): 14
+  62     End
+ ------------------------------------------------------------------
+ 
++/(((a\2)|(a*)\g<-1>))*a?/B
++------------------------------------------------------------------
++  0  39 Bra
++  2     Brazero
++  3  32 SCBra 1
++  6  27 Once
++  8  12 CBra 2
++ 11   7 CBra 3
++ 14     a
++ 16     \2
++ 18   7 Ket
++ 20  11 Alt
++ 22   5 CBra 4
++ 25     a*
++ 27   5 Ket
++ 29  22 Recurse
++ 31  23 Ket
++ 33  27 Ket
++ 35  32 KetRmax
++ 37     a?+
++ 39  39 Ket
++ 41     End
++------------------------------------------------------------------
++
+ /-- End of testinput11 --/
+diff --git a/testdata/testoutput11-32 b/testdata/testoutput11-32
+index 266e55d..7b7b030 100644
+--- a/testdata/testoutput11-32
++++ b/testdata/testoutput11-32
+@@ -709,4 +709,28 @@ Memory allocation (code space): 28
+  62     End
+ ------------------------------------------------------------------
+ 
++/(((a\2)|(a*)\g<-1>))*a?/B
++------------------------------------------------------------------
++  0  39 Bra
++  2     Brazero
++  3  32 SCBra 1
++  6  27 Once
++  8  12 CBra 2
++ 11   7 CBra 3
++ 14     a
++ 16     \2
++ 18   7 Ket
++ 20  11 Alt
++ 22   5 CBra 4
++ 25     a*
++ 27   5 Ket
++ 29  22 Recurse
++ 31  23 Ket
++ 33  27 Ket
++ 35  32 KetRmax
++ 37     a?+
++ 39  39 Ket
++ 41     End
++------------------------------------------------------------------
++
+ /-- End of testinput11 --/
+diff --git a/testdata/testoutput11-8 b/testdata/testoutput11-8
+index d4a2133..f5ec652 100644
+--- a/testdata/testoutput11-8
++++ b/testdata/testoutput11-8
+@@ -709,4 +709,28 @@ Memory allocation (code space): 10
+  76     End
+ ------------------------------------------------------------------
+ 
++/(((a\2)|(a*)\g<-1>))*a?/B
++------------------------------------------------------------------
++  0  57 Bra
++  3     Brazero
++  4  48 SCBra 1
++  9  40 Once
++ 12  18 CBra 2
++ 17  10 CBra 3
++ 22     a
++ 24     \2
++ 27  10 Ket
++ 30  16 Alt
++ 33   7 CBra 4
++ 38     a*
++ 40   7 Ket
++ 43  33 Recurse
++ 46  34 Ket
++ 49  40 Ket
++ 52  48 KetRmax
++ 55     a?+
++ 57  57 Ket
++ 60     End
++------------------------------------------------------------------
++
+ /-- End of testinput11 --/
+diff --git a/testdata/testoutput2 b/testdata/testoutput2
+index 114817a..1e87026 100644
+--- a/testdata/testoutput2
++++ b/testdata/testoutput2
+@@ -14093,6 +14093,30 @@ Failed: malformed number or name after (?( at offset 4
+ /(?(R&6yh)abc)/
+ Failed: group name must start with a non-digit at offset 5
+ 
++/(((a\2)|(a*)\g<-1>))*a?/BZ
++------------------------------------------------------------------
++        Bra
++        Brazero
++        SCBra 1
++        Once
++        CBra 2
++        CBra 3
++        a
++        \2
++        Ket
++        Alt
++        CBra 4
++        a*
++        Ket
++        Recurse
++        Ket
++        Ket
++        KetRmax
++        a?+
++        Ket
++        End
++------------------------------------------------------------------
++
+ /-- Test the ugly "start or end of word" compatibility syntax --/
+ 
+ /[[:<:]]red[[:>:]]/BZ
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-empty-matching-possessive-zero-repeat-groups-bug.patch b/pcre-8.35-Fix-empty-matching-possessive-zero-repeat-groups-bug.patch
new file mode 100644
index 0000000..2d82134
--- /dev/null
+++ b/pcre-8.35-Fix-empty-matching-possessive-zero-repeat-groups-bug.patch
@@ -0,0 +1,192 @@
+From 31152356367ef3cf3440c0431d2898f198e4dd18 Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Tue, 27 May 2014 13:18:31 +0000
+Subject: [PATCH] Fix empty-matching possessive zero-repeat groups 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@1478 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ pcre_exec.c          | 43 +++++++++++++++++++++++++++----------------
+ testdata/testinput1  |  9 +++++++++
+ testdata/testinput8  |  6 ++++++
+ testdata/testoutput1 | 12 ++++++++++++
+ testdata/testoutput8 |  8 ++++++++
+ 5 files changed, 62 insertions(+), 16 deletions(-)
+
+diff --git a/pcre_exec.c b/pcre_exec.c
+index 5dec992..5a8dbad 100644
+--- a/pcre_exec.c
++++ b/pcre_exec.c
+@@ -1167,11 +1167,16 @@ for (;;)
+         if (rrc == MATCH_KETRPOS)
+           {
+           offset_top = md->end_offset_top;
+-          eptr = md->end_match_ptr;
+           ecode = md->start_code + code_offset;
+           save_capture_last = md->capture_last;
+           matched_once = TRUE;
+           mstart = md->start_match_ptr;    /* In case \K changed it */
++          if (eptr == md->end_match_ptr)   /* Matched an empty string */
++            {
++            do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
++            break;
++            }  
++          eptr = md->end_match_ptr;
+           continue;
+           }
+ 
+@@ -1241,10 +1246,15 @@ for (;;)
+       if (rrc == MATCH_KETRPOS)
+         {
+         offset_top = md->end_offset_top;
+-        eptr = md->end_match_ptr;
+         ecode = md->start_code + code_offset;
+         matched_once = TRUE;
+         mstart = md->start_match_ptr;   /* In case \K reset it */
++        if (eptr == md->end_match_ptr)  /* Matched an empty string */
++          {
++          do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
++          break;
++          }  
++        eptr = md->end_match_ptr;
+         continue;
+         }
+ 
+@@ -1894,7 +1904,7 @@ for (;;)
+     case OP_KETRMAX:
+     case OP_KETRPOS:
+     prev = ecode - GET(ecode, 1);
+-
++    
+     /* If this was a group that remembered the subject start, in order to break
+     infinite repeats of empty string matches, retrieve the subject start from
+     the chain. Otherwise, set it NULL. */
+@@ -1919,7 +1929,7 @@ for (;;)
+       md->start_match_ptr = mstart;
+       RRETURN(MATCH_MATCH);         /* Sets md->mark */
+       }
+-
++      
+     /* For capturing groups we have to check the group number back at the start
+     and if necessary complete handling an extraction by setting the offsets and
+     bumping the high water mark. Whole-pattern recursion is coded as a recurse
+@@ -1979,6 +1989,19 @@ for (;;)
+         }
+       }
+ 
++    /* OP_KETRPOS is a possessive repeating ket. Remember the current position,
++    and return the MATCH_KETRPOS. This makes it possible to do the repeats one
++    at a time from the outer level, thus saving stack. This must precede the 
++    empty string test - in this case that test is done at the outer level. */
++
++    if (*ecode == OP_KETRPOS)
++      {
++      md->start_match_ptr = mstart;    /* In case \K reset it */
++      md->end_match_ptr = eptr;
++      md->end_offset_top = offset_top;
++      RRETURN(MATCH_KETRPOS);
++      }
++
+     /* For an ordinary non-repeating ket, just continue at this level. This
+     also happens for a repeating ket if no characters were matched in the
+     group. This is the forcible breaking of infinite loops as implemented in
+@@ -2001,18 +2024,6 @@ for (;;)
+       break;
+       }
+ 
+-    /* OP_KETRPOS is a possessive repeating ket. Remember the current position,
+-    and return the MATCH_KETRPOS. This makes it possible to do the repeats one
+-    at a time from the outer level, thus saving stack. */
+-
+-    if (*ecode == OP_KETRPOS)
+-      {
+-      md->start_match_ptr = mstart;    /* In case \K reset it */
+-      md->end_match_ptr = eptr;
+-      md->end_offset_top = offset_top;
+-      RRETURN(MATCH_KETRPOS);
+-      }
+-
+     /* The normal repeating kets try the rest of the pattern or restart from
+     the preceding bracket, in the appropriate order. In the second case, we can
+     use tail recursion to avoid using another stack frame, unless we have an
+diff --git a/testdata/testinput1 b/testdata/testinput1
+index f933692..ffb9455 100644
+--- a/testdata/testinput1
++++ b/testdata/testinput1
+@@ -5675,4 +5675,13 @@ AbcdCBefgBhiBqz
+ /[\Q]a\E]+/
+     aa]]
+ 
++'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testinput8 b/testdata/testinput8
+index bb2747b..06334cd 100644
+--- a/testdata/testinput8
++++ b/testdata/testinput8
+@@ -4831,4 +4831,10 @@
+ /[ab]{2,}?/
+     aaaa    
+ 
++'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++
+ /-- End of testinput8 --/
+diff --git a/testdata/testoutput1 b/testdata/testoutput1
+index 3d9a328..b2ae430 100644
+--- a/testdata/testoutput1
++++ b/testdata/testoutput1
+@@ -9325,4 +9325,16 @@ No match
+     aa]]
+  0: aa]]
+ 
++'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++ 0: NON QUOTED "QUOT""ED" AFTER 
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++ 0: NON QUOTED "QUOT""ED" AFTER 
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++ 0: NON QUOTED "QUOT""ED" AFTER 
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testoutput8 b/testdata/testoutput8
+index 3861ea4..95c4e4d 100644
+--- a/testdata/testoutput8
++++ b/testdata/testoutput8
+@@ -7777,4 +7777,12 @@ Matched, but offsets vector is too small to show all matches
+  1: aaa
+  2: aa
+ 
++'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++ 0: NON QUOTED "QUOT""ED" AFTER 
++
++'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
++    NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
++ 0: NON QUOTED "QUOT""ED" AFTER 
++
+ /-- End of testinput8 --/
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-not-including-VT-in-starting-characters-for-s.patch b/pcre-8.35-Fix-not-including-VT-in-starting-characters-for-s.patch
new file mode 100644
index 0000000..1d47bdd
--- /dev/null
+++ b/pcre-8.35-Fix-not-including-VT-in-starting-characters-for-s.patch
@@ -0,0 +1,217 @@
+From da9e61642f795d859ef94e1e7a1f2b93489f915a Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Wed, 18 Jun 2014 16:48:57 +0000
+Subject: [PATCH] Fix not including VT in starting characters for \s.
+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@1486 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ pcre_study.c             | 13 +++----------
+ testdata/testinput1      |  3 +++
+ testdata/testoutput1     |  4 ++++
+ testdata/testoutput15    | 20 ++++++++++----------
+ testdata/testoutput18-16 | 30 +++++++++++++++---------------
+ testdata/testoutput18-32 | 30 +++++++++++++++---------------
+ 6 files changed, 50 insertions(+), 50 deletions(-)
+
+diff --git a/pcre_study.c b/pcre_study.c
+index ab9510e..cb6c424 100644
+--- a/pcre_study.c
++++ b/pcre_study.c
+@@ -1106,24 +1106,17 @@ do
+       try_next = FALSE;
+       break;
+ 
+-      /* The cbit_space table has vertical tab as whitespace; we have to
+-      ensure it is set as not whitespace. Luckily, the code value is the same
+-      (0x0b) in ASCII and EBCDIC, so we can just adjust the appropriate bit. */
++      /* The cbit_space table has vertical tab as whitespace; we no longer
++      have to play fancy tricks because Perl added VT to its whitespace at
++      release 5.18. PCRE added it at release 8.34. */
+ 
+       case OP_NOT_WHITESPACE:
+       set_nottype_bits(start_bits, cbit_space, table_limit, cd);
+-      start_bits[1] |= 0x08;
+       try_next = FALSE;
+       break;
+ 
+-      /* The cbit_space table has vertical tab as whitespace; we have to not
+-      set it from the table. Luckily, the code value is the same (0x0b) in
+-      ASCII and EBCDIC, so we can just adjust the appropriate bit. */
+-
+       case OP_WHITESPACE:
+-      c = start_bits[1];    /* Save in case it was already set */
+       set_type_bits(start_bits, cbit_space, table_limit, cd);
+-      start_bits[1] = (start_bits[1] & ~0x08) | c;
+       try_next = FALSE;
+       break;
+ 
+diff --git a/testdata/testinput1 b/testdata/testinput1
+index 7b36360..b68e574 100644
+--- a/testdata/testinput1
++++ b/testdata/testinput1
+@@ -5666,4 +5666,7 @@ AbcdCBefgBhiBqz
+ /(a\Kb)*/+
+     ababc
+ 
++/\sabc/
++    \x{0b}abc
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testoutput1 b/testdata/testoutput1
+index 4dafc04..e0e5f2c 100644
+--- a/testdata/testoutput1
++++ b/testdata/testoutput1
+@@ -9313,4 +9313,8 @@ No match
+  0+ c
+  1: ab
+ 
++/\sabc/
++    \x{0b}abc
++ 0: \x0babc
++
+ /-- End of testinput1 --/
+diff --git a/testdata/testoutput15 b/testdata/testoutput15
+index 5af369d..bad2807 100644
+--- a/testdata/testoutput15
++++ b/testdata/testoutput15
+@@ -871,7 +871,7 @@ Options: utf
+ No first char
+ Need char = 'x'
+ Subject length lower bound = 5
+-Starting chars: \x09 \x0a \x0c \x0d \x20 \xc2 
++Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \xc2 
+     AB\x{85}xxx\x{a0}XYZ
+  0: \x{85}xxx\x{a0}
+     AB\x{a0}xxx\x{85}XYZ
+@@ -883,15 +883,15 @@ Options: utf
+ No first char
+ Need char = ' '
+ Subject length lower bound = 3
+-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e 
+-  \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d 
+-  \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 
+-  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e 
+-  f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xc0 \xc1 \xc2 \xc3 
+-  \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 
+-  \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 
+-  \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 
+-  \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff 
++Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
++  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
++  \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C 
++  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h 
++  i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xc0 \xc1 \xc2 \xc3 \xc4 
++  \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 
++  \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 
++  \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 
++  \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff 
+     \x{a2} \x{84} 
+  0: \x{a2} \x{84}
+     A Z 
+diff --git a/testdata/testoutput18-16 b/testdata/testoutput18-16
+index a196205..1ef8704 100644
+--- a/testdata/testoutput18-16
++++ b/testdata/testoutput18-16
+@@ -752,7 +752,7 @@ Options: utf
+ No first char
+ Need char = 'x'
+ Subject length lower bound = 5
+-Starting chars: \x09 \x0a \x0c \x0d \x20 \x85 \xa0 
++Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
+     AB\x{85}xxx\x{a0}XYZ
+  0: \x{85}xxx\x{a0}
+     AB\x{a0}xxx\x{85}XYZ
+@@ -764,20 +764,20 @@ Options: utf
+ No first char
+ Need char = ' '
+ Subject length lower bound = 3
+-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e 
+-  \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d 
+-  \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 
+-  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e 
+-  f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 
+-  \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 
+-  \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 
+-  \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 
+-  \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 
+-  \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 
+-  \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf 
+-  \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee 
+-  \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd 
+-  \xfe \xff 
++Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
++  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
++  \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C 
++  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h 
++  i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
++  \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 
++  \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 \xa4 
++  \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 
++  \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 
++  \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 
++  \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 
++  \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef 
++  \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe 
++  \xff 
+     \x{a2} \x{84}
+  0: \x{a2} \x{84}
+     A Z
+diff --git a/testdata/testoutput18-32 b/testdata/testoutput18-32
+index 1525994..622ba64 100644
+--- a/testdata/testoutput18-32
++++ b/testdata/testoutput18-32
+@@ -749,7 +749,7 @@ Options: utf
+ No first char
+ Need char = 'x'
+ Subject length lower bound = 5
+-Starting chars: \x09 \x0a \x0c \x0d \x20 \x85 \xa0 
++Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
+     AB\x{85}xxx\x{a0}XYZ
+  0: \x{85}xxx\x{a0}
+     AB\x{a0}xxx\x{85}XYZ
+@@ -761,20 +761,20 @@ Options: utf
+ No first char
+ Need char = ' '
+ Subject length lower bound = 3
+-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0b \x0e 
+-  \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d 
+-  \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 
+-  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e 
+-  f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 
+-  \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 
+-  \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 
+-  \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 
+-  \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 
+-  \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 
+-  \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf 
+-  \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee 
+-  \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd 
+-  \xfe \xff 
++Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
++  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
++  \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C 
++  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h 
++  i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
++  \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 
++  \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 \xa4 
++  \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 
++  \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 
++  \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 
++  \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 
++  \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef 
++  \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe 
++  \xff 
+     \x{a2} \x{84}
+  0: \x{a2} \x{84}
+     A Z
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fix-zero-repeat-assertion-condition-bug.patch b/pcre-8.35-Fix-zero-repeat-assertion-condition-bug.patch
new file mode 100644
index 0000000..008ca1d
--- /dev/null
+++ b/pcre-8.35-Fix-zero-repeat-assertion-condition-bug.patch
@@ -0,0 +1,75 @@
+From 0a194d08b66c1bfd613cd7bd1b68aaf6876d4727 Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+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ř <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+---
+ pcre_exec.c          |  7 +++++--
+ testdata/testinput2  |  6 ++++++
+ testdata/testoutput2 | 10 ++++++++++
+ 3 files changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/pcre_exec.c b/pcre_exec.c
+index 0227740..bb8ac1a 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 a7cacf6..cc4fb16 100644
+--- a/testdata/testinput2
++++ b/testdata/testinput2
+@@ -4064,4 +4064,10 @@ backtracking verbs. --/
+ 
+ /(((((a)))))/Q
+ 
++"((?=(?(?=(?(?=(?(?=())))*)))))"
++    a
++
++"(?(?=)?==)(((((((((?=)))))))))"
++    a
++
+ /-- End of testinput2 --/
+diff --git a/testdata/testoutput2 b/testdata/testoutput2
+index f0fcf03..eabbfab 100644
+--- a/testdata/testoutput2
++++ b/testdata/testoutput2
+@@ -14173,4 +14173,14 @@ Failed: parentheses are too deeply nested (stack check) at offset 0
+ /(((((a)))))/Q
+ ** Missing 0 or 1 after /Q
+ 
++"((?=(?(?=(?(?=(?(?=())))*)))))"
++    a
++ 0: 
++ 1: 
++ 2: 
++
++"(?(?=)?==)(((((((((?=)))))))))"
++    a
++No match
++
+ /-- End of testinput2 --/
+-- 
+1.9.3
+
diff --git a/pcre-8.35-Fixed-several-memory-leaks-in-pcregrep.patch b/pcre-8.35-Fixed-several-memory-leaks-in-pcregrep.patch
new file mode 100644
index 0000000..377645d
--- /dev/null
+++ b/pcre-8.35-Fixed-several-memory-leaks-in-pcregrep.patch
@@ -0,0 +1,127 @@
+From bbbc944ef10fe3f383e95b10c13308c0695d0d1a Mon Sep 17 00:00:00 2001
+From: ph10 <ph10 at 2f5784b3-3f2a-0410-8824-cb99058d5e15>
+Date: Tue, 8 Jul 2014 16:16:14 +0000
+Subject: [PATCH] Fixed several memory leaks 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@1492 2f5784b3-3f2a-0410-8824-cb99058d5e15
+Signed-off-by: Petr Písař <ppisar at redhat.com>
+
+Petr Pisar: Ported to 8.35.
+
+diff --git a/pcregrep.c b/pcregrep.c
+index 3e8d05d..fc3f3b2 100644
+--- a/pcregrep.c
++++ b/pcregrep.c
+@@ -455,7 +455,7 @@ Arguments:
+   s          pattern string to add
+   after      if not NULL points to item to insert after
+ 
+-Returns:     new pattern block
++Returns:     new pattern block or NULL on error
+ */
+ 
+ static patstr *
+@@ -471,6 +471,7 @@ if (strlen(s) > MAXPATLEN)
+   {
+   fprintf(stderr, "pcregrep: pattern is too long (limit is %d bytes)\n",
+     MAXPATLEN);
++  free(p);   
+   return NULL;
+   }
+ p->next = NULL;
+@@ -2549,7 +2550,11 @@ while (fgets(buffer, PATBUFSIZE, f) != NULL)
+   afterwards, as a precaution against any later code trying to use it. */
+ 
+   *patlastptr = add_pattern(buffer, *patlastptr);
+-  if (*patlastptr == NULL) return FALSE;
++  if (*patlastptr == NULL) 
++    {
++    if (f != stdin) fclose(f);
++    return FALSE;
++    } 
+   if (*patptr == NULL) *patptr = *patlastptr;
+ 
+   /* This loop is needed because compiling a "pattern" when -F is set may add
+@@ -2561,7 +2566,10 @@ while (fgets(buffer, PATBUFSIZE, f) != NULL)
+     {
+     if (!compile_pattern(*patlastptr, pcre_options, popts, TRUE, filename,
+         linenumber))
++      {   
++      if (f != stdin) fclose(f);
+       return FALSE;
++      } 
+     (*patlastptr)->string = NULL;            /* Insurance */
+     if ((*patlastptr)->next == NULL) break;
+     *patlastptr = (*patlastptr)->next;
+@@ -2962,8 +2970,8 @@ if (locale == NULL)
+   locale_from = "LC_CTYPE";
+   }
+ 
+-/* If a locale has been provided, set it, and generate the tables the PCRE
+-needs. Otherwise, pcretables==NULL, which causes the use of default tables. */
++/* If a locale is set, use it to generate the tables the PCRE needs. Otherwise,
++pcretables==NULL, which causes the use of default tables. */
+ 
+ if (locale != NULL)
+   {
+@@ -2971,7 +2979,7 @@ if (locale != NULL)
+     {
+     fprintf(stderr, "pcregrep: Failed to set locale %s (obtained from %s)\n",
+       locale, locale_from);
+-    return 2;
++    goto EXIT2;
+     }
+   pcretables = pcre_maketables();
+   }
+@@ -2986,7 +2994,7 @@ if (colour_option != NULL && strcmp(colour_option, "never") != 0)
+     {
+     fprintf(stderr, "pcregrep: Unknown colour setting \"%s\"\n",
+       colour_option);
+-    return 2;
++    goto EXIT2;
+     }
+   if (do_colour)
+     {
+@@ -3026,7 +3034,7 @@ else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0)
+ else
+   {
+   fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline);
+-  return 2;
++  goto EXIT2;
+   }
+ 
+ /* Interpret the text values for -d and -D */
+@@ -3039,7 +3047,7 @@ if (dee_option != NULL)
+   else
+     {
+     fprintf(stderr, "pcregrep: Invalid value \"%s\" for -d\n", dee_option);
+-    return 2;
++    goto EXIT2;
+     }
+   }
+ 
+@@ -3050,7 +3058,7 @@ if (DEE_option != NULL)
+   else
+     {
+     fprintf(stderr, "pcregrep: Invalid value \"%s\" for -D\n", DEE_option);
+-    return 2;
++    goto EXIT2;
+     }
+   }
+ 
+@@ -3251,7 +3259,8 @@ EXIT:
+ if (jit_stack != NULL) pcre_jit_stack_free(jit_stack);
+ #endif
+ 
+-if (main_buffer != NULL) free(main_buffer);
++free(main_buffer);
++free((void *)pcretables);
+ 
+ free_pattern_chain(patterns);
+ free_pattern_chain(include_patterns);
+-- 
+1.9.3
+
diff --git a/sources b/sources
index 62629af..953c4f3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-eb34b2c9c727fd64940d6fd9a00995eb  pcre-8.34.tar.gz
+6aacb23986adccd9b3bc626c00979958  pcre-8.35.tar.bz2


More information about the scm-commits mailing list