Install PCRE 6.2.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 8 Aug 2005 10:22:14 +0000 (10:22 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 8 Aug 2005 10:22:14 +0000 (10:22 +0000)
20 files changed:
doc/doc-txt/pcrepattern.txt
doc/doc-txt/pcretest.txt
src/src/pcre/ChangeLog
src/src/pcre/dftables.c
src/src/pcre/pcre.h
src/src/pcre/pcre_compile.c
src/src/pcre/pcre_config.c
src/src/pcre/pcre_exec.c
src/src/pcre/pcre_fullinfo.c
src/src/pcre/pcre_get.c
src/src/pcre/pcre_globals.c
src/src/pcre/pcre_internal.h
src/src/pcre/pcre_maketables.c
src/src/pcre/pcre_printint.c
src/src/pcre/pcre_study.c
src/src/pcre/pcre_tables.c
src/src/pcre/pcre_try_flipped.c
src/src/pcre/pcre_version.c
src/src/pcre/pcretest.c
src/src/pcre/ucp.h

index 29fbe5652c10340f226a756024e590d7cdb98f4d..b638a00db16129b97772faab36da9f2476ffcc2b 100644 (file)
@@ -1,11 +1,12 @@
 This file contains the PCRE man page that describes the regular expressions
-supported by PCRE version 6.0. Note that not all of the features are relevant
+supported by PCRE version 6.2. Note that not all of the features are relevant
 in the context of Exim. In particular, the version of PCRE that is compiled
 with Exim does not include UTF-8 support, there is no mechanism for changing
 the options with which the PCRE functions are called, and features such as
 callout are not accessible.
 -----------------------------------------------------------------------------
 
+PCREPATTERN(3)                                                  PCREPATTERN(3)
 
 
 NAME
index 384a6c38fb51fd8c8e79bfe2f7704d96f5af0f4a..695741daea34d69e737dee03f5fa0be99b186300 100644 (file)
@@ -6,10 +6,10 @@ is built with Exim.
 PCRETEST(1)                                                        PCRETEST(1)
 
 
-
 NAME
        pcretest - a program for testing Perl-compatible regular expressions.
 
+
 SYNOPSIS
 
        pcretest [-C] [-d] [-dfa] [-i] [-m] [-o osize] [-p] [-t] [source]
index 5dc20f9352fecbc9fa1568ebbe6cafaec9616dc3..b9d74d393f71b59c01b4dcccac63ec3aa9ffdd66 100644 (file)
@@ -1,6 +1,69 @@
 ChangeLog for PCRE
 ------------------
 
+Version 6.2 01-Aug-05
+---------------------
+
+ 1. There was no test for integer overflow of quantifier values. A construction
+    such as {1111111111111111} would give undefined results. What is worse, if
+    a minimum quantifier for a parenthesized subpattern overflowed and became
+    negative, the calculation of the memory size went wrong. This could have
+    led to memory overwriting.
+
+ 2. Building PCRE using VPATH was broken. Hopefully it is now fixed.
+
+ 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like
+    operating environments where this matters.
+
+ 4. Applied Giuseppe Maxia's patch to add additional features for controlling
+    PCRE options from within the C++ wrapper.
+
+ 5. Named capturing subpatterns were not being correctly counted when a pattern
+    was compiled. This caused two problems: (a) If there were more than 100
+    such subpatterns, the calculation of the memory needed for the whole
+    compiled pattern went wrong, leading to an overflow error. (b) Numerical
+    back references of the form \12, where the number was greater than 9, were
+    not recognized as back references, even though there were sufficient
+    previous subpatterns.
+
+ 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older
+    versions of gcc, e.g. 2.95.4.
+
+
+Version 6.1 21-Jun-05
+---------------------
+
+ 1. There was one reference to the variable "posix" in pcretest.c that was not
+    surrounded by "#if !defined NOPOSIX".
+
+ 2. Make it possible to compile pcretest without DFA support, UTF8 support, or
+    the cross-check on the old pcre_info() function, for the benefit of the
+    cut-down version of PCRE that is currently imported into Exim.
+
+ 3. A (silly) pattern starting with (?i)(?-i) caused an internal space
+    allocation error. I've done the easy fix, which wastes 2 bytes for sensible
+    patterns that start (?i) but I don't think that matters. The use of (?i) is
+    just an example; this all applies to the other options as well.
+
+ 4. Since libtool seems to echo the compile commands it is issuing, the output
+    from "make" can be reduced a bit by putting "@" in front of each libtool
+    compile command.
+
+ 5. Patch from the folks at Google for configure.in to be a bit more thorough
+    in checking for a suitable C++ installation before trying to compile the
+    C++ stuff. This should fix a reported problem when a compiler was present,
+    but no suitable headers.
+
+ 6. The man pages all had just "PCRE" as their title. I have changed them to
+    be the relevant file name. I have also arranged that these names are
+    retained in the file doc/pcre.txt, which is a concatenation in text format
+    of all the man pages except the little individual ones for each function.
+
+ 7. The NON-UNIX-USE file had not been updated for the different set of source
+    files that come with release 6. I also added a few comments about the C++
+    wrapper.
+
+
 Version 6.0 07-Jun-05
 ---------------------
 
index 450a00bf4be31a71e88978adc2d06dbd7a1ba100..6380d9321f3f221b8c37e70e9f6aff0898c1a608 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/dftables.c,v 1.2 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/dftables.c,v 1.3 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
@@ -68,7 +68,7 @@ if (argc != 2)
   return 1;
   }
 
-f = fopen(argv[1], "w");
+f = fopen(argv[1], "wb");
 if (f == NULL)
   {
   fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]);
index 3c4c663e051b792c99138c38688d8d0ef1ad449e..1a1e9b87dc86b14de92d7a2662c838488eab1634 100644 (file)
@@ -1,5 +1,3 @@
-/* $Cambridge: exim/src/src/pcre/pcre.h,v 1.2 2005/06/15 08:57:10 ph10 Exp $ */
-
 /*************************************************
 *       Perl-Compatible Regular Expressions      *
 *************************************************/
@@ -45,8 +43,8 @@ POSSIBILITY OF SUCH DAMAGE.
 make changes to pcre.in. */
 
 #define PCRE_MAJOR          6
-#define PCRE_MINOR          0
-#define PCRE_DATE           07-Jun-2005
+#define PCRE_MINOR          2
+#define PCRE_DATE           01-Aug-2005
 
 /* Win32 uses DLL by default; it needs special stuff for exported functions. */
 
index 0b439e1f7c9fc3f9d9ba1311c7561754a8ad50a0..7306a278c86d7017abe47ad2ad4138a3bbefc839 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_compile.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_compile.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
@@ -700,7 +700,18 @@ read_repeat_counts(const uschar *p, int *minp, int *maxp, int *errorcodeptr)
 int min = 0;
 int max = -1;
 
+/* Read the minimum value and do a paranoid check: a negative value indicates
+an integer overflow. */
+
 while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
+if (min < 0 || min > 65535)
+  {
+  *errorcodeptr = ERR5;
+  return p;
+  }
+
+/* Read the maximum value if there is one, and again do a paranoid on its size.
+Also, max must not be less than min. */
 
 if (*p == '}') max = min; else
   {
@@ -708,6 +719,11 @@ if (*p == '}') max = min; else
     {
     max = 0;
     while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
+    if (max < 0 || max > 65535)
+      {
+      *errorcodeptr = ERR5;
+      return p;
+      }
     if (max < min)
       {
       *errorcodeptr = ERR4;
@@ -716,16 +732,11 @@ if (*p == '}') max = min; else
     }
   }
 
-/* Do paranoid checks, then fill in the required variables, and pass back the
-pointer to the terminating '}'. */
+/* Fill in the required variables, and pass back the pointer to the terminating
+'}'. */
 
-if (min > 65535 || max > 65535)
-  *errorcodeptr = ERR5;
-else
-  {
-  *minp = min;
-  *maxp = max;
-  }
+*minp = min;
+*maxp = max;
 return p;
 }
 
@@ -3858,6 +3869,7 @@ BOOL utf8;
 BOOL class_utf8;
 #endif
 BOOL inescq = FALSE;
+BOOL capturing;
 unsigned int brastackptr = 0;
 size_t size;
 uschar *code;
@@ -4412,6 +4424,7 @@ while ((c = *(++ptr)) != 0)
     case '(':
     branch_newextra = 0;
     bracket_length = 1 + LINK_SIZE;
+    capturing = FALSE;
 
     /* Handle special forms of bracket, which all start (? */
 
@@ -4499,6 +4512,9 @@ while ((c = *(++ptr)) != 0)
 
         case 'P':
         ptr += 3;
+
+        /* Handle the definition of a named subpattern */
+
         if (*ptr == '<')
           {
           const uschar *p;    /* Don't amalgamate; some compilers */
@@ -4511,9 +4527,12 @@ while ((c = *(++ptr)) != 0)
             }
           name_count++;
           if (ptr - p > max_name_size) max_name_size = (ptr - p);
+          capturing = TRUE;   /* Named parentheses are always capturing */
           break;
           }
 
+        /* Handle back references and recursive calls to named subpatterns */
+
         if (*ptr == '=' || *ptr == '>')
           {
           while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0);
@@ -4627,6 +4646,14 @@ while ((c = *(++ptr)) != 0)
             nothing is done here and it is handled during the compiling
             process.
 
+            We allow for more than one options setting at the start. If such
+            settings do not change the existing options, nothing is compiled.
+            However, we must leave space just in case something is compiled.
+            This can happen for pathological sequences such as (?i)(?-i)
+            because the global options will end up with -i set. The space is
+            small and not significant. (Before I did this there was a reported
+            bug with (?i)(?-i) in a machine-generated pattern.)
+
             [Historical note: Up to Perl 5.8, options settings at top level
             were always global settings, wherever they appeared in the pattern.
             That is, they were equivalent to an external setting. From 5.8
@@ -4639,6 +4666,7 @@ while ((c = *(++ptr)) != 0)
               options = (options | set) & (~unset);
               set = unset = 0;     /* To save length */
               item_count--;        /* To allow for several */
+              length += 2;
               }
 
             /* Fall through */
@@ -4688,18 +4716,24 @@ while ((c = *(++ptr)) != 0)
           continue;
           }
 
-        /* If options were terminated by ':' control comes here. Fall through
-        to handle the group below. */
+        /* If options were terminated by ':' control comes here. This is a
+        non-capturing group with an options change. There is nothing more that
+        needs to be done because "capturing" is already set FALSE by default;
+        we can just fall through. */
+
         }
       }
 
-    /* Extracting brackets must be counted so we can process escapes in a
-    Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to
-    need an additional 3 bytes of store per extracting bracket. However, if
-    PCRE_NO_AUTO)CAPTURE is set, unadorned brackets become non-capturing, so we
-    must leave the count alone (it will aways be zero). */
+    /* Ordinary parentheses, not followed by '?', are capturing unless
+    PCRE_NO_AUTO_CAPTURE is set. */
+
+    else capturing = (options & PCRE_NO_AUTO_CAPTURE) == 0;
+
+    /* Capturing brackets must be counted so we can process escapes in a
+    Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to need
+    an additional 3 bytes of memory per capturing bracket. */
 
-    else if ((options & PCRE_NO_AUTO_CAPTURE) == 0)
+    if (capturing)
       {
       bracount++;
       if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;
index 1d768acd44cfaead80379cb61394694a3e777780..ce02c878b1a23ede3ecdb608ae0ef7f0db9fa5e0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_config.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_config.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index ff4af1c9e0378739e56396482dfa2c483b1b0f08..85feb45e8b102ef7803c8927cb96dd1aa7a5234c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_exec.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_exec.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 45106ca92532d6d647f41a8482b25f6cbf97fc64..645a58280bf07f87445c3b27448acb393f225632 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_fullinfo.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_fullinfo.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index e458a6b9379fd5585b2edfb83f59010c6b65661f..e0b00f1713e7d41d2f25170368dfe3f3c15acb77 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_get.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_get.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 737f6b2cd55754b9f6911c3ed8a9cc5f157e8e68..434a57a2444d258785e2a76fedf005ba50817933 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_globals.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_globals.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index a66f78a89a41558317b7e9f19281cacd590b1b76..4b35bcb9bc98ddad9036167a6908f6a9a1aae4f5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_internal.h,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_internal.h,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index a710d6adcca3681a49fce4b0baa6960ceafeeeba..d686383ac49bace9071cd1a95e1409380c507d61 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_maketables.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_maketables.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 5ddc5074f95f9808b6474b68bc723ff7ce7362f0..aef437380fb16299c1f865b6fad2d513c7a6e66c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_printint.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_printint.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 85868f48d087de002296e0fca5b4b80dbc3cfda0..18b5b680a60cadb12413b674acc1e4b7fb4ecb3e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_study.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_study.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 3d431590190fc515035a43a39569799bf6511ee5..e8120ccc550f038fd0d7da52c57bcc80fee23417 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_tables.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_tables.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index 3c6f9503b0b379e82100a174a32b6feec6c774e5..3069d1fb069c6c46379210d182a9b545e18b2b56 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_try_flipped.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_try_flipped.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index b5f2c87ba87dd6dd84fa399f5187d2b91af0fdf0..871d19fed9cfea71d2a14f403d9389ef1c498c34 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcre_version.c,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcre_version.c,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *      Perl-Compatible Regular Expressions       *
index fe2701b37cc4763d6ca74056c3188c973be9c7da..17e646044af3565a272f06cfcb64e1b989fc4c7e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/pcretest.c,v 1.2 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/pcretest.c,v 1.3 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *             PCRE testing program               *
@@ -64,8 +64,8 @@ Makefile. */
 #include "pcreposix.h"
 #endif
 
-/* It is also possible, for the benefit of the version imported into Exim, to 
-build pcretest without support for UTF8 (define NOUTF8), without the interface 
+/* It is also possible, for the benefit of the version imported into Exim, to
+build pcretest without support for UTF8 (define NOUTF8), without the interface
 to the DFA matcher (NODFA), and without the doublecheck of the old "info"
 function (define NOINFOCHECK). */
 
@@ -205,7 +205,7 @@ int yield = 0;
 
 while (length-- > 0)
   {
-#if !defined NOUTF8   
+#if !defined NOUTF8
   if (use_utf8)
     {
     int rc = utf82ord(p, &c);
@@ -478,7 +478,7 @@ while (argc > 1 && argv[op][0] == '-')
   else if (strcmp(argv[op], "-t") == 0) timeit = 1;
   else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
   else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
-#if !defined NODFA   
+#if !defined NODFA
   else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;
 #endif
   else if (strcmp(argv[op], "-o") == 0 && argc > 2 &&
index eefbe1b2ddec34e4abe8473b50540e5f82132c1c..fab202438783f50f9c9ba5bb0cd0162783064659 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/pcre/ucp.h,v 1.1 2005/06/15 08:57:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/pcre/ucp.h,v 1.2 2005/08/08 10:22:14 ph10 Exp $ */
 
 /*************************************************
 *     libucp - Unicode Property Table handler    *