/[pcre]/code/trunk/pcre_compile.c
ViewVC logotype

Diff of /code/trunk/pcre_compile.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 107 by ph10, Wed Mar 7 11:02:28 2007 UTC revision 215 by ph10, Wed Aug 15 14:20:05 2007 UTC
# Line 6  Line 6 
6  and semantics are as close as possible to those of the Perl 5 language.  and semantics are as close as possible to those of the Perl 5 language.
7    
8                         Written by Philip Hazel                         Written by Philip Hazel
9             Copyright (c) 1997-2006 University of Cambridge             Copyright (c) 1997-2007 University of Cambridge
10    
11  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
12  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 42  POSSIBILITY OF SUCH DAMAGE. Line 42  POSSIBILITY OF SUCH DAMAGE.
42  supporting internal functions that are not used by other modules. */  supporting internal functions that are not used by other modules. */
43    
44    
45    #ifdef HAVE_CONFIG_H
46    #include <config.h>
47    #endif
48    
49  #define NLBLOCK cd             /* Block containing newline information */  #define NLBLOCK cd             /* Block containing newline information */
50  #define PSSTART start_pattern  /* Field containing processed string start */  #define PSSTART start_pattern  /* Field containing processed string start */
51  #define PSEND   end_pattern    /* Field containing processed string end */  #define PSEND   end_pattern    /* Field containing processed string end */
52    
   
53  #include "pcre_internal.h"  #include "pcre_internal.h"
54    
55    
# Line 58  used by pcretest. DEBUG is not defined w Line 61  used by pcretest. DEBUG is not defined w
61  #endif  #endif
62    
63    
64    /* Macro for setting individual bits in class bitmaps. */
65    
66    #define SETBIT(a,b) a[b/8] |= (1 << (b%8))
67    
68    /* Maximum length value to check against when making sure that the integer that
69    holds the compiled pattern length does not overflow. We make it a bit less than
70    INT_MAX to allow for adding in group terminating bytes, so that we don't have
71    to check them every time. */
72    
73    #define OFLOW_MAX (INT_MAX - 20)
74    
75    
76  /*************************************************  /*************************************************
77  *      Code parameters and static tables         *  *      Code parameters and static tables         *
78  *************************************************/  *************************************************/
# Line 87  static const short int escapes[] = { Line 102  static const short int escapes[] = {
102       0,      0,      0,      0,      0,      0,      0,      0,   /* 0 - 7 */       0,      0,      0,      0,      0,      0,      0,      0,   /* 0 - 7 */
103       0,      0,    ':',    ';',    '<',    '=',    '>',    '?',   /* 8 - ? */       0,      0,    ':',    ';',    '<',    '=',    '>',    '?',   /* 8 - ? */
104     '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E,      0, -ESC_G,   /* @ - G */     '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E,      0, -ESC_G,   /* @ - G */
105       0,      0,      0,      0,      0,      0,      0,      0,   /* H - O */  -ESC_H,      0,      0, -ESC_K,      0,      0,      0,      0,   /* H - O */
106  -ESC_P, -ESC_Q, -ESC_R, -ESC_S,      0,      0,      0, -ESC_W,   /* P - W */  -ESC_P, -ESC_Q, -ESC_R, -ESC_S,      0,      0, -ESC_V, -ESC_W,   /* P - W */
107  -ESC_X,      0, -ESC_Z,    '[',   '\\',    ']',    '^',    '_',   /* X - _ */  -ESC_X,      0, -ESC_Z,    '[',   '\\',    ']',    '^',    '_',   /* X - _ */
108     '`',      7, -ESC_b,      0, -ESC_d,  ESC_e,  ESC_f,      0,   /* ` - g */     '`',      7, -ESC_b,      0, -ESC_d,  ESC_e,  ESC_f,      0,   /* ` - g */
109       0,      0,      0, -ESC_k,      0,      0,  ESC_n,      0,   /* h - o */  -ESC_h,      0,      0, -ESC_k,      0,      0,  ESC_n,      0,   /* h - o */
110  -ESC_p,      0,  ESC_r, -ESC_s,  ESC_tee,    0,      0, -ESC_w,   /* p - w */  -ESC_p,      0,  ESC_r, -ESC_s,  ESC_tee,    0, -ESC_v, -ESC_w,   /* p - w */
111       0,      0, -ESC_z                                            /* x - z */       0,      0, -ESC_z                                            /* x - z */
112  };  };
113    
# Line 106  static const short int escapes[] = { Line 121  static const short int escapes[] = {
121  /*  70 */     0,     0,      0,       0,      0,     0,      0,      0,  /*  70 */     0,     0,      0,       0,      0,     0,      0,      0,
122  /*  78 */     0,   '`',    ':',     '#',    '@',  '\'',    '=',    '"',  /*  78 */     0,   '`',    ':',     '#',    '@',  '\'',    '=',    '"',
123  /*  80 */     0,     7, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,  /*  80 */     0,     7, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,
124  /*  88 */     0,     0,      0,     '{',      0,     0,      0,      0,  /*  88 */-ESC_h,     0,      0,     '{',      0,     0,      0,      0,
125  /*  90 */     0,     0, -ESC_k,     'l',      0, ESC_n,      0, -ESC_p,  /*  90 */     0,     0, -ESC_k,     'l',      0, ESC_n,      0, -ESC_p,
126  /*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,  /*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,
127  /*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,     0, -ESC_w,      0,  /*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,-ESC_v, -ESC_w,      0,
128  /*  A8 */     0,-ESC_z,      0,       0,      0,   '[',      0,      0,  /*  A8 */     0,-ESC_z,      0,       0,      0,   '[',      0,      0,
129  /*  B0 */     0,     0,      0,       0,      0,     0,      0,      0,  /*  B0 */     0,     0,      0,       0,      0,     0,      0,      0,
130  /*  B8 */     0,     0,      0,       0,      0,   ']',    '=',    '-',  /*  B8 */     0,     0,      0,       0,      0,   ']',    '=',    '-',
131  /*  C0 */   '{',-ESC_A, -ESC_B,  -ESC_C, -ESC_D,-ESC_E,      0, -ESC_G,  /*  C0 */   '{',-ESC_A, -ESC_B,  -ESC_C, -ESC_D,-ESC_E,      0, -ESC_G,
132  /*  C8 */     0,     0,      0,       0,      0,     0,      0,      0,  /*  C8 */-ESC_H,     0,      0,       0,      0,     0,      0,      0,
133  /*  D0 */   '}',     0,      0,       0,      0,     0,      0, -ESC_P,  /*  D0 */   '}',     0, -ESC_K,       0,      0,     0,      0, -ESC_P,
134  /*  D8 */-ESC_Q,-ESC_R,      0,       0,      0,     0,      0,      0,  /*  D8 */-ESC_Q,-ESC_R,      0,       0,      0,     0,      0,      0,
135  /*  E0 */  '\\',     0, -ESC_S,       0,      0,     0, -ESC_W, -ESC_X,  /*  E0 */  '\\',     0, -ESC_S,       0,      0,-ESC_V, -ESC_W, -ESC_X,
136  /*  E8 */     0,-ESC_Z,      0,       0,      0,     0,      0,      0,  /*  E8 */     0,-ESC_Z,      0,       0,      0,     0,      0,      0,
137  /*  F0 */     0,     0,      0,       0,      0,     0,      0,      0,  /*  F0 */     0,     0,      0,       0,      0,     0,      0,      0,
138  /*  F8 */     0,     0,      0,       0,      0,     0,      0,      0  /*  F8 */     0,     0,      0,       0,      0,     0,      0,      0
# Line 125  static const short int escapes[] = { Line 140  static const short int escapes[] = {
140  #endif  #endif
141    
142    
143    /* Table of special "verbs" like (*PRUNE) */
144    
145    typedef struct verbitem {
146      const char *name;
147      int   len;
148      int   op;
149    } verbitem;
150    
151    static verbitem verbs[] = {
152      { "ACCEPT", 6, OP_ACCEPT },
153      { "COMMIT", 6, OP_COMMIT },
154      { "F",      1, OP_FAIL },
155      { "FAIL",   4, OP_FAIL },
156      { "PRUNE",  5, OP_PRUNE },
157      { "SKIP",   4, OP_SKIP  },
158      { "THEN",   4, OP_THEN  }
159    };
160    
161    static int verbcount = sizeof(verbs)/sizeof(verbitem);
162    
163    
164  /* Tables of names of POSIX character classes and their lengths. The list is  /* Tables of names of POSIX character classes and their lengths. The list is
165  terminated by a zero length entry. The first three must be alpha, lower, upper,  terminated by a zero length entry. The first three must be alpha, lower, upper,
166  as this is assumed for handling case independence. */  as this is assumed for handling case independence. */
# Line 198  static const char *error_texts[] = { Line 234  static const char *error_texts[] = {
234    "missing ) after comment",    "missing ) after comment",
235    "parentheses nested too deeply",  /** DEAD **/    "parentheses nested too deeply",  /** DEAD **/
236    /* 20 */    /* 20 */
237    "regular expression too large",    "regular expression is too large",
238    "failed to get memory",    "failed to get memory",
239    "unmatched parentheses",    "unmatched parentheses",
240    "internal error: code overflow",    "internal error: code overflow",
# Line 208  static const char *error_texts[] = { Line 244  static const char *error_texts[] = {
244    "malformed number or name after (?(",    "malformed number or name after (?(",
245    "conditional group contains more than two branches",    "conditional group contains more than two branches",
246    "assertion expected after (?(",    "assertion expected after (?(",
247    "(?R or (?digits must be followed by )",    "(?R or (?[+-]digits must be followed by )",
248    /* 30 */    /* 30 */
249    "unknown POSIX class name",    "unknown POSIX class name",
250    "POSIX collating elements are not supported",    "POSIX collating elements are not supported",
# Line 234  static const char *error_texts[] = { Line 270  static const char *error_texts[] = {
270    "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)",    "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)",
271    "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")",    "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")",
272    /* 50 */    /* 50 */
273    "repeated subpattern is too long",    "repeated subpattern is too long",    /** DEAD **/
274    "octal value is greater than \\377 (not in UTF-8 mode)",    "octal value is greater than \\377 (not in UTF-8 mode)",
275    "internal error: overran compiling workspace",    "internal error: overran compiling workspace",
276    "internal error: previously-checked referenced subpattern not found",    "internal error: previously-checked referenced subpattern not found",
# Line 242  static const char *error_texts[] = { Line 278  static const char *error_texts[] = {
278    /* 55 */    /* 55 */
279    "repeating a DEFINE group is not allowed",    "repeating a DEFINE group is not allowed",
280    "inconsistent NEWLINE options",    "inconsistent NEWLINE options",
281    "\\g is not followed by an (optionally braced) non-zero number"    "\\g is not followed by a braced name or an optionally braced non-zero number",
282      "(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number",
283      "(*VERB) with an argument is not supported",
284      /* 60 */
285      "(*VERB) not recognized",
286      "number is too big"
287  };  };
288    
289    
# Line 373  static const unsigned char ebcdic_charta Line 414  static const unsigned char ebcdic_charta
414  /* Definition to allow mutual recursion */  /* Definition to allow mutual recursion */
415    
416  static BOOL  static BOOL
417    compile_regex(int, int, uschar **, const uschar **, int *, BOOL, int, int *,    compile_regex(int, int, uschar **, const uschar **, int *, BOOL, BOOL, int,
418      int *, branch_chain *, compile_data *, int *);      int *, int *, branch_chain *, compile_data *, int *);
419    
420    
421    
# Line 399  Arguments: Line 440  Arguments:
440    
441  Returns:         zero or positive => a data character  Returns:         zero or positive => a data character
442                   negative => a special escape sequence                   negative => a special escape sequence
443                   on error, errorptr is set                   on error, errorcodeptr is set
444  */  */
445    
446  static int  static int
# Line 452  else Line 493  else
493    
494      /* \g must be followed by a number, either plain or braced. If positive, it      /* \g must be followed by a number, either plain or braced. If positive, it
495      is an absolute backreference. If negative, it is a relative backreference.      is an absolute backreference. If negative, it is a relative backreference.
496      This is a Perl 5.10 feature. */      This is a Perl 5.10 feature. Perl 5.10 also supports \g{name} as a
497        reference to a named group. This is part of Perl's movement towards a
498        unified syntax for back references. As this is synonymous with \k{name}, we
499        fudge it up by pretending it really was \k. */
500    
501      case 'g':      case 'g':
502      if (ptr[1] == '{')      if (ptr[1] == '{')
503        {        {
504          const uschar *p;
505          for (p = ptr+2; *p != 0 && *p != '}'; p++)
506            if (*p != '-' && (digitab[*p] & ctype_digit) == 0) break;
507          if (*p != 0 && *p != '}')
508            {
509            c = -ESC_k;
510            break;
511            }
512        braced = TRUE;        braced = TRUE;
513        ptr++;        ptr++;
514        }        }
# Line 472  else Line 524  else
524      c = 0;      c = 0;
525      while ((digitab[ptr[1]] & ctype_digit) != 0)      while ((digitab[ptr[1]] & ctype_digit) != 0)
526        c = c * 10 + *(++ptr) - '0';        c = c * 10 + *(++ptr) - '0';
527    
528        if (c < 0)
529          {
530          *errorcodeptr = ERR61;
531          break;
532          }
533    
534      if (c == 0 || (braced && *(++ptr) != '}'))      if (c == 0 || (braced && *(++ptr) != '}'))
535        {        {
536        *errorcodeptr = ERR57;        *errorcodeptr = ERR57;
537        return 0;        break;
538        }        }
539    
540      if (negated)      if (negated)
# Line 484  else Line 542  else
542        if (c > bracount)        if (c > bracount)
543          {          {
544          *errorcodeptr = ERR15;          *errorcodeptr = ERR15;
545          return 0;          break;
546          }          }
547        c = bracount - (c - 1);        c = bracount - (c - 1);
548        }        }
# Line 513  else Line 571  else
571        c -= '0';        c -= '0';
572        while ((digitab[ptr[1]] & ctype_digit) != 0)        while ((digitab[ptr[1]] & ctype_digit) != 0)
573          c = c * 10 + *(++ptr) - '0';          c = c * 10 + *(++ptr) - '0';
574          if (c < 0)
575            {
576            *errorcodeptr = ERR61;
577            break;
578            }
579        if (c < 10 || c <= bracount)        if (c < 10 || c <= bracount)
580          {          {
581          c = -(ESC_REF + c);          c = -(ESC_REF + c);
# Line 608  else Line 671  else
671      if (c == 0)      if (c == 0)
672        {        {
673        *errorcodeptr = ERR2;        *errorcodeptr = ERR2;
674        return 0;        break;
675        }        }
676    
677  #ifndef EBCDIC  /* ASCII coding */  #ifndef EBCDIC  /* ASCII coding */
# Line 684  if (c == '{') Line 747  if (c == '{')
747      *negptr = TRUE;      *negptr = TRUE;
748      ptr++;      ptr++;
749      }      }
750    for (i = 0; i < sizeof(name) - 1; i++)    for (i = 0; i < (int)sizeof(name) - 1; i++)
751      {      {
752      c = *(++ptr);      c = *(++ptr);
753      if (c == 0) goto ERROR_RETURN;      if (c == 0) goto ERROR_RETURN;
# Line 887  for (; *ptr != 0; ptr++) Line 950  for (; *ptr != 0; ptr++)
950      {      {
951      while (*(++ptr) != ']')      while (*(++ptr) != ']')
952        {        {
953          if (*ptr == 0) return -1;
954        if (*ptr == '\\')        if (*ptr == '\\')
955          {          {
956          if (*(++ptr) == 0) return -1;          if (*(++ptr) == 0) return -1;
# Line 914  for (; *ptr != 0; ptr++) Line 978  for (; *ptr != 0; ptr++)
978    /* An opening parens must now be a real metacharacter */    /* An opening parens must now be a real metacharacter */
979    
980    if (*ptr != '(') continue;    if (*ptr != '(') continue;
981    if (ptr[1] != '?')    if (ptr[1] != '?' && ptr[1] != '*')
982      {      {
983      count++;      count++;
984      if (name == NULL && count == lorn) return count;      if (name == NULL && count == lorn) return count;
# Line 1267  for (;;) Line 1331  for (;;)
1331        if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];        if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];
1332        break;        break;
1333        }        }
1334  #endif  #endif
1335      }      }
1336    }    }
1337  }  }
# Line 1332  for (;;) Line 1396  for (;;)
1396        if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];        if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f];
1397        break;        break;
1398        }        }
1399  #endif  #endif
1400      }      }
1401    }    }
1402  }  }
# Line 1370  for (code = first_significant_code(code Line 1434  for (code = first_significant_code(code
1434    
1435    c = *code;    c = *code;
1436    
1437    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE)    /* Groups with zero repeats can of course be empty; skip them. */
1438    
1439      if (c == OP_BRAZERO || c == OP_BRAMINZERO)
1440        {
1441        code += _pcre_OP_lengths[c];
1442        do code += GET(code, 1); while (*code == OP_ALT);
1443        c = *code;
1444        continue;
1445        }
1446    
1447      /* For other groups, scan the branches. */
1448    
1449      if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND)
1450      {      {
1451      BOOL empty_branch;      BOOL empty_branch;
1452      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
# Line 1386  for (code = first_significant_code(code Line 1462  for (code = first_significant_code(code
1462        }        }
1463      while (*code == OP_ALT);      while (*code == OP_ALT);
1464      if (!empty_branch) return FALSE;   /* All branches are non-empty */      if (!empty_branch) return FALSE;   /* All branches are non-empty */
1465        c = *code;
     /* Move past the KET and fudge things so that the increment in the "for"  
     above has no effect. */  
   
     c = OP_END;  
     code += 1 + LINK_SIZE - _pcre_OP_lengths[c];  
1466      continue;      continue;
1467      }      }
1468    
# Line 1925  if (next >= 0) switch(op_code) Line 1996  if (next >= 0) switch(op_code)
1996    case OP_NOT_WORDCHAR:    case OP_NOT_WORDCHAR:
1997    return next <= 127 && (cd->ctypes[next] & ctype_word) != 0;    return next <= 127 && (cd->ctypes[next] & ctype_word) != 0;
1998    
1999      case OP_HSPACE:
2000      case OP_NOT_HSPACE:
2001      switch(next)
2002        {
2003        case 0x09:
2004        case 0x20:
2005        case 0xa0:
2006        case 0x1680:
2007        case 0x180e:
2008        case 0x2000:
2009        case 0x2001:
2010        case 0x2002:
2011        case 0x2003:
2012        case 0x2004:
2013        case 0x2005:
2014        case 0x2006:
2015        case 0x2007:
2016        case 0x2008:
2017        case 0x2009:
2018        case 0x200A:
2019        case 0x202f:
2020        case 0x205f:
2021        case 0x3000:
2022        return op_code != OP_HSPACE;
2023        default:
2024        return op_code == OP_HSPACE;
2025        }
2026    
2027      case OP_VSPACE:
2028      case OP_NOT_VSPACE:
2029      switch(next)
2030        {
2031        case 0x0a:
2032        case 0x0b:
2033        case 0x0c:
2034        case 0x0d:
2035        case 0x85:
2036        case 0x2028:
2037        case 0x2029:
2038        return op_code != OP_VSPACE;
2039        default:
2040        return op_code == OP_VSPACE;
2041        }
2042    
2043    default:    default:
2044    return FALSE;    return FALSE;
2045    }    }
# Line 1959  switch(op_code) Line 2074  switch(op_code)
2074      case ESC_W:      case ESC_W:
2075      return item <= 127 && (cd->ctypes[item] & ctype_word) != 0;      return item <= 127 && (cd->ctypes[item] & ctype_word) != 0;
2076    
2077        case ESC_h:
2078        case ESC_H:
2079        switch(item)
2080          {
2081          case 0x09:
2082          case 0x20:
2083          case 0xa0:
2084          case 0x1680:
2085          case 0x180e:
2086          case 0x2000:
2087          case 0x2001:
2088          case 0x2002:
2089          case 0x2003:
2090          case 0x2004:
2091          case 0x2005:
2092          case 0x2006:
2093          case 0x2007:
2094          case 0x2008:
2095          case 0x2009:
2096          case 0x200A:
2097          case 0x202f:
2098          case 0x205f:
2099          case 0x3000:
2100          return -next != ESC_h;
2101          default:
2102          return -next == ESC_h;
2103          }
2104    
2105        case ESC_v:
2106        case ESC_V:
2107        switch(item)
2108          {
2109          case 0x0a:
2110          case 0x0b:
2111          case 0x0c:
2112          case 0x0d:
2113          case 0x85:
2114          case 0x2028:
2115          case 0x2029:
2116          return -next != ESC_v;
2117          default:
2118          return -next == ESC_v;
2119          }
2120    
2121      default:      default:
2122      return FALSE;      return FALSE;
2123      }      }
2124    
2125    case OP_DIGIT:    case OP_DIGIT:
2126    return next == -ESC_D || next == -ESC_s || next == -ESC_W;    return next == -ESC_D || next == -ESC_s || next == -ESC_W ||
2127             next == -ESC_h || next == -ESC_v;
2128    
2129    case OP_NOT_DIGIT:    case OP_NOT_DIGIT:
2130    return next == -ESC_d;    return next == -ESC_d;
# Line 1973  switch(op_code) Line 2133  switch(op_code)
2133    return next == -ESC_S || next == -ESC_d || next == -ESC_w;    return next == -ESC_S || next == -ESC_d || next == -ESC_w;
2134    
2135    case OP_NOT_WHITESPACE:    case OP_NOT_WHITESPACE:
2136    return next == -ESC_s;    return next == -ESC_s || next == -ESC_h || next == -ESC_v;
2137    
2138      case OP_HSPACE:
2139      return next == -ESC_S || next == -ESC_H || next == -ESC_d || next == -ESC_w;
2140    
2141      case OP_NOT_HSPACE:
2142      return next == -ESC_h;
2143    
2144      /* Can't have \S in here because VT matches \S (Perl anomaly) */
2145      case OP_VSPACE:
2146      return next == -ESC_V || next == -ESC_d || next == -ESC_w;
2147    
2148      case OP_NOT_VSPACE:
2149      return next == -ESC_v;
2150    
2151    case OP_WORDCHAR:    case OP_WORDCHAR:
2152    return next == -ESC_W || next == -ESC_s;    return next == -ESC_W || next == -ESC_s || next == -ESC_h || next == -ESC_v;
2153    
2154    case OP_NOT_WORDCHAR:    case OP_NOT_WORDCHAR:
2155    return next == -ESC_w || next == -ESC_d;    return next == -ESC_w || next == -ESC_d;
# Line 2091  for (;; ptr++) Line 2264  for (;; ptr++)
2264    BOOL possessive_quantifier;    BOOL possessive_quantifier;
2265    BOOL is_quantifier;    BOOL is_quantifier;
2266    BOOL is_recurse;    BOOL is_recurse;
2267      BOOL reset_bracount;
2268    int class_charcount;    int class_charcount;
2269    int class_lastchar;    int class_lastchar;
2270    int newoptions;    int newoptions;
2271    int recno;    int recno;
2272      int refsign;
2273    int skipbytes;    int skipbytes;
2274    int subreqbyte;    int subreqbyte;
2275    int subfirstbyte;    int subfirstbyte;
# Line 2127  for (;; ptr++) Line 2302  for (;; ptr++)
2302      */      */
2303    
2304      if (code < last_code) code = last_code;      if (code < last_code) code = last_code;
2305    
2306        /* Paranoid check for integer overflow */
2307    
2308        if (OFLOW_MAX - *lengthptr < code - last_code)
2309          {
2310          *errorcodeptr = ERR20;
2311          goto FAILED;
2312          }
2313    
2314      *lengthptr += code - last_code;      *lengthptr += code - last_code;
2315      DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c));      DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c));
2316    
# Line 2239  for (;; ptr++) Line 2423  for (;; ptr++)
2423      *ptrptr = ptr;      *ptrptr = ptr;
2424      if (lengthptr != NULL)      if (lengthptr != NULL)
2425        {        {
2426          if (OFLOW_MAX - *lengthptr < code - last_code)
2427            {
2428            *errorcodeptr = ERR20;
2429            goto FAILED;
2430            }
2431        *lengthptr += code - last_code;   /* To include callout length */        *lengthptr += code - last_code;   /* To include callout length */
2432        DPRINTF((">> end branch\n"));        DPRINTF((">> end branch\n"));
2433        }        }
# Line 2301  for (;; ptr++) Line 2490  for (;; ptr++)
2490        goto FAILED;        goto FAILED;
2491        }        }
2492    
2493      /* If the first character is '^', set the negation flag and skip it. */      /* If the first character is '^', set the negation flag and skip it. Also,
2494        if the first few characters (either before or after ^) are \Q\E or \E we
2495        skip them too. This makes for compatibility with Perl. */
2496    
2497      if ((c = *(++ptr)) == '^')      negate_class = FALSE;
2498        for (;;)
2499        {        {
       negate_class = TRUE;  
2500        c = *(++ptr);        c = *(++ptr);
2501        }        if (c == '\\')
2502      else          {
2503        {          if (ptr[1] == 'E') ptr++;
2504        negate_class = FALSE;            else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3;
2505                else break;
2506            }
2507          else if (!negate_class && c == '^')
2508            negate_class = TRUE;
2509          else break;
2510        }        }
2511    
2512      /* Keep a count of chars with values < 256 so that we can optimize the case      /* Keep a count of chars with values < 256 so that we can optimize the case
# Line 2451  for (;; ptr++) Line 2647  for (;; ptr++)
2647        of the specials, which just set a flag. The sequence \b is a special        of the specials, which just set a flag. The sequence \b is a special
2648        case. Inside a class (and only there) it is treated as backspace.        case. Inside a class (and only there) it is treated as backspace.
2649        Elsewhere it marks a word boundary. Other escapes have preset maps ready        Elsewhere it marks a word boundary. Other escapes have preset maps ready
2650        to or into the one we are building. We assume they have more than one        to 'or' into the one we are building. We assume they have more than one
2651        character in them, so set class_charcount bigger than one. */        character in them, so set class_charcount bigger than one. */
2652    
2653        if (c == '\\')        if (c == '\\')
# Line 2519  for (;; ptr++) Line 2715  for (;; ptr++)
2715            else if (c == -ESC_d || c == -ESC_D || c == -ESC_w ||            else if (c == -ESC_d || c == -ESC_D || c == -ESC_w ||
2716                     c == -ESC_W || c == -ESC_s || c == -ESC_S) continue;                     c == -ESC_W || c == -ESC_s || c == -ESC_S) continue;
2717    
2718              /* We need to deal with \H, \h, \V, and \v in both phases because
2719              they use extra memory. */
2720    
2721              if (-c == ESC_h)
2722                {
2723                SETBIT(classbits, 0x09); /* VT */
2724                SETBIT(classbits, 0x20); /* SPACE */
2725                SETBIT(classbits, 0xa0); /* NSBP */
2726    #ifdef SUPPORT_UTF8
2727                if (utf8)
2728                  {
2729                  class_utf8 = TRUE;
2730                  *class_utf8data++ = XCL_SINGLE;
2731                  class_utf8data += _pcre_ord2utf8(0x1680, class_utf8data);
2732                  *class_utf8data++ = XCL_SINGLE;
2733                  class_utf8data += _pcre_ord2utf8(0x180e, class_utf8data);
2734                  *class_utf8data++ = XCL_RANGE;
2735                  class_utf8data += _pcre_ord2utf8(0x2000, class_utf8data);
2736                  class_utf8data += _pcre_ord2utf8(0x200A, class_utf8data);
2737                  *class_utf8data++ = XCL_SINGLE;
2738                  class_utf8data += _pcre_ord2utf8(0x202f, class_utf8data);
2739                  *class_utf8data++ = XCL_SINGLE;
2740                  class_utf8data += _pcre_ord2utf8(0x205f, class_utf8data);
2741                  *class_utf8data++ = XCL_SINGLE;
2742                  class_utf8data += _pcre_ord2utf8(0x3000, class_utf8data);
2743                  }
2744    #endif
2745                continue;
2746                }
2747    
2748              if (-c == ESC_H)
2749                {
2750                for (c = 0; c < 32; c++)
2751                  {
2752                  int x = 0xff;
2753                  switch (c)
2754                    {
2755                    case 0x09/8: x ^= 1 << (0x09%8); break;
2756                    case 0x20/8: x ^= 1 << (0x20%8); break;
2757                    case 0xa0/8: x ^= 1 << (0xa0%8); break;
2758                    default: break;
2759                    }
2760                  classbits[c] |= x;
2761                  }
2762    
2763    #ifdef SUPPORT_UTF8
2764                if (utf8)
2765                  {
2766                  class_utf8 = TRUE;
2767                  *class_utf8data++ = XCL_RANGE;
2768                  class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data);
2769                  class_utf8data += _pcre_ord2utf8(0x167f, class_utf8data);
2770                  *class_utf8data++ = XCL_RANGE;
2771                  class_utf8data += _pcre_ord2utf8(0x1681, class_utf8data);
2772                  class_utf8data += _pcre_ord2utf8(0x180d, class_utf8data);
2773                  *class_utf8data++ = XCL_RANGE;
2774                  class_utf8data += _pcre_ord2utf8(0x180f, class_utf8data);
2775                  class_utf8data += _pcre_ord2utf8(0x1fff, class_utf8data);
2776                  *class_utf8data++ = XCL_RANGE;
2777                  class_utf8data += _pcre_ord2utf8(0x200B, class_utf8data);
2778                  class_utf8data += _pcre_ord2utf8(0x202e, class_utf8data);
2779                  *class_utf8data++ = XCL_RANGE;
2780                  class_utf8data += _pcre_ord2utf8(0x2030, class_utf8data);
2781                  class_utf8data += _pcre_ord2utf8(0x205e, class_utf8data);
2782                  *class_utf8data++ = XCL_RANGE;
2783                  class_utf8data += _pcre_ord2utf8(0x2060, class_utf8data);
2784                  class_utf8data += _pcre_ord2utf8(0x2fff, class_utf8data);
2785                  *class_utf8data++ = XCL_RANGE;
2786                  class_utf8data += _pcre_ord2utf8(0x3001, class_utf8data);
2787                  class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data);
2788                  }
2789    #endif
2790                continue;
2791                }
2792    
2793              if (-c == ESC_v)
2794                {
2795                SETBIT(classbits, 0x0a); /* LF */
2796                SETBIT(classbits, 0x0b); /* VT */
2797                SETBIT(classbits, 0x0c); /* FF */
2798                SETBIT(classbits, 0x0d); /* CR */
2799                SETBIT(classbits, 0x85); /* NEL */
2800    #ifdef SUPPORT_UTF8
2801                if (utf8)
2802                  {
2803                  class_utf8 = TRUE;
2804                  *class_utf8data++ = XCL_RANGE;
2805                  class_utf8data += _pcre_ord2utf8(0x2028, class_utf8data);
2806                  class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data);
2807                  }
2808    #endif
2809                continue;
2810                }
2811    
2812              if (-c == ESC_V)
2813                {
2814                for (c = 0; c < 32; c++)
2815                  {
2816                  int x = 0xff;
2817                  switch (c)
2818                    {
2819                    case 0x0a/8: x ^= 1 << (0x0a%8);
2820                                 x ^= 1 << (0x0b%8);
2821                                 x ^= 1 << (0x0c%8);
2822                                 x ^= 1 << (0x0d%8);
2823                                 break;
2824                    case 0x85/8: x ^= 1 << (0x85%8); break;
2825                    default: break;
2826                    }
2827                  classbits[c] |= x;
2828                  }
2829    
2830    #ifdef SUPPORT_UTF8
2831                if (utf8)
2832                  {
2833                  class_utf8 = TRUE;
2834                  *class_utf8data++ = XCL_RANGE;
2835                  class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data);
2836                  class_utf8data += _pcre_ord2utf8(0x2027, class_utf8data);
2837                  *class_utf8data++ = XCL_RANGE;
2838                  class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data);
2839                  class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data);
2840                  }
2841    #endif
2842                continue;
2843                }
2844    
2845            /* We need to deal with \P and \p in both phases. */            /* We need to deal with \P and \p in both phases. */
2846    
2847  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
# Line 2659  for (;; ptr++) Line 2982  for (;; ptr++)
2982              unsigned int origd = d;              unsigned int origd = d;
2983              while (get_othercase_range(&cc, origd, &occ, &ocd))              while (get_othercase_range(&cc, origd, &occ, &ocd))
2984                {                {
2985                if (occ >= c && ocd <= d) continue;  /* Skip embedded ranges */                if (occ >= (unsigned int)c &&
2986                      ocd <= (unsigned int)d)
2987                    continue;                          /* Skip embedded ranges */
2988    
2989                if (occ < c  && ocd >= c - 1)        /* Extend the basic range */                if (occ < (unsigned int)c  &&
2990                      ocd >= (unsigned int)c - 1)      /* Extend the basic range */
2991                  {                                  /* if there is overlap,   */                  {                                  /* if there is overlap,   */
2992                  c = occ;                           /* noting that if occ < c */                  c = occ;                           /* noting that if occ < c */
2993                  continue;                          /* we can't have ocd > d  */                  continue;                          /* we can't have ocd > d  */
2994                  }                                  /* because a subrange is  */                  }                                  /* because a subrange is  */
2995                if (ocd > d && occ <= d + 1)         /* always shorter than    */                if (ocd > (unsigned int)d &&
2996                      occ <= (unsigned int)d + 1)      /* always shorter than    */
2997                  {                                  /* the basic range.       */                  {                                  /* the basic range.       */
2998                  d = ocd;                  d = ocd;
2999                  continue;                  continue;
# Line 3262  for (;; ptr++) Line 3589  for (;; ptr++)
3589          goto FAILED;          goto FAILED;
3590          }          }
3591    
       /* This is a paranoid check to stop integer overflow later on */  
   
       if (len > MAX_DUPLENGTH)  
         {  
         *errorcodeptr = ERR50;  
         goto FAILED;  
         }  
   
3592        /* If the maximum repeat count is unlimited, find the end of the bracket        /* If the maximum repeat count is unlimited, find the end of the bracket
3593        by scanning through from the start, and compute the offset back to it        by scanning through from the start, and compute the offset back to it
3594        from the current code pointer. There may be an OP_OPT setting following        from the current code pointer. There may be an OP_OPT setting following
# Line 3358  for (;; ptr++) Line 3677  for (;; ptr++)
3677          if (repeat_min > 1)          if (repeat_min > 1)
3678            {            {
3679            /* In the pre-compile phase, we don't actually do the replication. We            /* In the pre-compile phase, we don't actually do the replication. We
3680            just adjust the length as if we had. */            just adjust the length as if we had. Do some paranoid checks for
3681              potential integer overflow. */
3682    
3683            if (lengthptr != NULL)            if (lengthptr != NULL)
3684              *lengthptr += (repeat_min - 1)*length_prevgroup;              {
3685                int delta = (repeat_min - 1)*length_prevgroup;
3686                if ((double)(repeat_min - 1)*(double)length_prevgroup >
3687                                                                (double)INT_MAX ||
3688                    OFLOW_MAX - *lengthptr < delta)
3689                  {
3690                  *errorcodeptr = ERR20;
3691                  goto FAILED;
3692                  }
3693                *lengthptr += delta;
3694                }
3695    
3696            /* This is compiling for real */            /* This is compiling for real */
3697    
# Line 3399  for (;; ptr++) Line 3729  for (;; ptr++)
3729          /* In the pre-compile phase, we don't actually do the replication. We          /* In the pre-compile phase, we don't actually do the replication. We
3730          just adjust the length as if we had. For each repetition we must add 1          just adjust the length as if we had. For each repetition we must add 1
3731          to the length for BRAZERO and for all but the last repetition we must          to the length for BRAZERO and for all but the last repetition we must
3732          add 2 + 2*LINKSIZE to allow for the nesting that occurs. */          add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some
3733            paranoid checks to avoid integer overflow. */
3734    
3735          if (lengthptr != NULL && repeat_max > 0)          if (lengthptr != NULL && repeat_max > 0)
3736            *lengthptr += repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -            {
3737              2 - 2*LINK_SIZE;  /* Last one doesn't nest */            int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
3738                          2 - 2*LINK_SIZE;   /* Last one doesn't nest */
3739              if ((double)repeat_max *
3740                    (double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)
3741                      > (double)INT_MAX ||
3742                  OFLOW_MAX - *lengthptr < delta)
3743                {
3744                *errorcodeptr = ERR20;
3745                goto FAILED;
3746                }
3747              *lengthptr += delta;
3748              }
3749    
3750          /* This is compiling for real */          /* This is compiling for real */
3751    
# Line 3555  for (;; ptr++) Line 3897  for (;; ptr++)
3897      /* ===================================================================*/      /* ===================================================================*/
3898      /* Start of nested parenthesized sub-expression, or comment or lookahead or      /* Start of nested parenthesized sub-expression, or comment or lookahead or
3899      lookbehind or option setting or condition or all the other extended      lookbehind or option setting or condition or all the other extended
3900      parenthesis forms. First deal with the specials; all are introduced by ?,      parenthesis forms.  */
     and the appearance of any of them means that this is not a capturing  
     group. */  
3901    
3902      case '(':      case '(':
3903      newoptions = options;      newoptions = options;
3904      skipbytes = 0;      skipbytes = 0;
3905      bravalue = OP_CBRA;      bravalue = OP_CBRA;
3906      save_hwm = cd->hwm;      save_hwm = cd->hwm;
3907        reset_bracount = FALSE;
3908    
3909        /* First deal with various "verbs" that can be introduced by '*'. */
3910    
3911        if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
3912          {
3913          int i, namelen;
3914          const uschar *name = ++ptr;
3915          previous = NULL;
3916          while ((cd->ctypes[*++ptr] & ctype_letter) != 0);
3917          if (*ptr == ':')
3918            {
3919            *errorcodeptr = ERR59;   /* Not supported */
3920            goto FAILED;
3921            }
3922          if (*ptr != ')')
3923            {
3924            *errorcodeptr = ERR60;
3925            goto FAILED;
3926            }
3927          namelen = ptr - name;
3928          for (i = 0; i < verbcount; i++)
3929            {
3930            if (namelen == verbs[i].len &&
3931                strncmp((char *)name, verbs[i].name, namelen) == 0)
3932              {
3933              *code = verbs[i].op;
3934              if (*code++ == OP_ACCEPT) cd->had_accept = TRUE;
3935              break;
3936              }
3937            }
3938          if (i < verbcount) continue;
3939          *errorcodeptr = ERR60;
3940          goto FAILED;
3941          }
3942    
3943        /* Deal with the extended parentheses; all are introduced by '?', and the
3944        appearance of any of them means that this is not a capturing group. */
3945    
3946      if (*(++ptr) == '?')      else if (*ptr == '?')
3947        {        {
3948        int i, set, unset, namelen;        int i, set, unset, namelen;
3949        int *optset;        int *optset;
# Line 3586  for (;; ptr++) Line 3964  for (;; ptr++)
3964    
3965    
3966          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
3967            case '|':                 /* Reset capture count for each branch */
3968            reset_bracount = TRUE;
3969            /* Fall through */
3970    
3971            /* ------------------------------------------------------------ */
3972          case ':':                 /* Non-capturing bracket */          case ':':                 /* Non-capturing bracket */
3973          bravalue = OP_BRA;          bravalue = OP_BRA;
3974          ptr++;          ptr++;
# Line 3621  for (;; ptr++) Line 4004  for (;; ptr++)
4004    
4005          code[1+LINK_SIZE] = OP_CREF;          code[1+LINK_SIZE] = OP_CREF;
4006          skipbytes = 3;          skipbytes = 3;
4007            refsign = -1;
4008    
4009          /* Check for a test for recursion in a named group. */          /* Check for a test for recursion in a named group. */
4010    
# Line 3644  for (;; ptr++) Line 4028  for (;; ptr++)
4028            terminator = '\'';            terminator = '\'';
4029            ptr++;            ptr++;
4030            }            }
4031          else terminator = 0;          else
4032              {
4033              terminator = 0;
4034              if (ptr[1] == '-' || ptr[1] == '+') refsign = *(++ptr);
4035              }
4036    
4037          /* We now expect to read a name; any thing else is an error */          /* We now expect to read a name; any thing else is an error */
4038    
# Line 3680  for (;; ptr++) Line 4068  for (;; ptr++)
4068          if (lengthptr != NULL) break;          if (lengthptr != NULL) break;
4069    
4070          /* In the real compile we do the work of looking for the actual          /* In the real compile we do the work of looking for the actual
4071          reference. */          reference. If the string started with "+" or "-" we require the rest to
4072            be digits, in which case recno will be set. */
4073    
4074            if (refsign > 0)
4075              {
4076              if (recno <= 0)
4077                {
4078                *errorcodeptr = ERR58;
4079                goto FAILED;
4080                }
4081              if (refsign == '-')
4082                {
4083                recno = cd->bracount - recno + 1;
4084                if (recno <= 0)
4085                  {
4086                  *errorcodeptr = ERR15;
4087                  goto FAILED;
4088                  }
4089                }
4090              else recno += cd->bracount;
4091              PUT2(code, 2+LINK_SIZE, recno);
4092              break;
4093              }
4094    
4095            /* Otherwise (did not start with "+" or "-"), start by looking for the
4096            name. */
4097    
4098          slot = cd->name_table;          slot = cd->name_table;
4099          for (i = 0; i < cd->names_found; i++)          for (i = 0; i < cd->names_found; i++)
# Line 3772  for (;; ptr++) Line 4185  for (;; ptr++)
4185    
4186          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4187          case '!':                 /* Negative lookahead */          case '!':                 /* Negative lookahead */
         bravalue = OP_ASSERT_NOT;  
4188          ptr++;          ptr++;
4189            if (*ptr == ')')          /* Optimize (?!) */
4190              {
4191              *code++ = OP_FAIL;
4192              previous = NULL;
4193              continue;
4194              }
4195            bravalue = OP_ASSERT_NOT;
4196          break;          break;
4197    
4198    
# Line 3999  for (;; ptr++) Line 4418  for (;; ptr++)
4418    
4419    
4420          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4421            case '-': case '+':
4422          case '0': case '1': case '2': case '3': case '4':   /* Recursion or */          case '0': case '1': case '2': case '3': case '4':   /* Recursion or */
4423          case '5': case '6': case '7': case '8': case '9':   /* subroutine */          case '5': case '6': case '7': case '8': case '9':   /* subroutine */
4424            {            {
4425            const uschar *called;            const uschar *called;
4426    
4427              if ((refsign = *ptr) == '+') ptr++;
4428              else if (refsign == '-')
4429                {
4430                if ((digitab[ptr[1]] & ctype_digit) == 0)
4431                  goto OTHER_CHAR_AFTER_QUERY;
4432                ptr++;
4433                }
4434    
4435            recno = 0;            recno = 0;
4436            while((digitab[*ptr] & ctype_digit) != 0)            while((digitab[*ptr] & ctype_digit) != 0)
4437              recno = recno * 10 + *ptr++ - '0';              recno = recno * 10 + *ptr++ - '0';
4438    
4439            if (*ptr != ')')            if (*ptr != ')')
4440              {              {
4441              *errorcodeptr = ERR29;              *errorcodeptr = ERR29;
4442              goto FAILED;              goto FAILED;
4443              }              }
4444    
4445              if (refsign == '-')
4446                {
4447                if (recno == 0)
4448                  {
4449                  *errorcodeptr = ERR58;
4450                  goto FAILED;
4451                  }
4452                recno = cd->bracount - recno + 1;
4453                if (recno <= 0)
4454                  {
4455                  *errorcodeptr = ERR15;
4456                  goto FAILED;
4457                  }
4458                }
4459              else if (refsign == '+')
4460                {
4461                if (recno == 0)
4462                  {
4463                  *errorcodeptr = ERR58;
4464                  goto FAILED;
4465                  }
4466                recno += cd->bracount;
4467                }
4468    
4469            /* Come here from code above that handles a named recursion */            /* Come here from code above that handles a named recursion */
4470    
4471            HANDLE_RECURSION:            HANDLE_RECURSION:
# Line 4084  for (;; ptr++) Line 4538  for (;; ptr++)
4538    
4539          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4540          default:              /* Other characters: check option setting */          default:              /* Other characters: check option setting */
4541            OTHER_CHAR_AFTER_QUERY:
4542          set = unset = 0;          set = unset = 0;
4543          optset = &set;          optset = &set;
4544    
# Line 4218  for (;; ptr++) Line 4673  for (;; ptr++)
4673           errorcodeptr,                 /* Where to put an error message */           errorcodeptr,                 /* Where to put an error message */
4674           (bravalue == OP_ASSERTBACK ||           (bravalue == OP_ASSERTBACK ||
4675            bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */            bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
4676             reset_bracount,               /* True if (?| group */
4677           skipbytes,                    /* Skip over bracket number */           skipbytes,                    /* Skip over bracket number */
4678           &subfirstbyte,                /* For possible first char */           &subfirstbyte,                /* For possible first char */
4679           &subreqbyte,                  /* For possible last char */           &subreqbyte,                  /* For possible last char */
# Line 4234  for (;; ptr++) Line 4690  for (;; ptr++)
4690      is on the bracket. */      is on the bracket. */
4691    
4692      /* If this is a conditional bracket, check that there are no more than      /* If this is a conditional bracket, check that there are no more than
4693      two branches in the group, or just one if it's a DEFINE group. */      two branches in the group, or just one if it's a DEFINE group. We do this
4694        in the real compile phase, not in the pre-pass, where the whole group may
4695        not be available. */
4696    
4697      if (bravalue == OP_COND)      if (bravalue == OP_COND && lengthptr == NULL)
4698        {        {
4699        uschar *tc = code;        uschar *tc = code;
4700        int condcount = 0;        int condcount = 0;
# Line 4290  for (;; ptr++) Line 4748  for (;; ptr++)
4748    
4749      if (lengthptr != NULL)      if (lengthptr != NULL)
4750        {        {
4751          if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE)
4752            {
4753            *errorcodeptr = ERR20;
4754            goto FAILED;
4755            }
4756        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
4757        code++;        code++;
4758        PUTINC(code, 0, 1 + LINK_SIZE);        PUTINC(code, 0, 1 + LINK_SIZE);
# Line 4396  for (;; ptr++) Line 4859  for (;; ptr++)
4859        zerofirstbyte = firstbyte;        zerofirstbyte = firstbyte;
4860        zeroreqbyte = reqbyte;        zeroreqbyte = reqbyte;
4861    
4862        /* \k<name> or \k'name' is a back reference by name (Perl syntax) */        /* \k<name> or \k'name' is a back reference by name (Perl syntax).
4863          We also support \k{name} (.NET syntax) */
4864    
4865        if (-c == ESC_k && (ptr[1] == '<' || ptr[1] == '\''))        if (-c == ESC_k && (ptr[1] == '<' || ptr[1] == '\'' || ptr[1] == '{'))
4866          {          {
4867          is_recurse = FALSE;          is_recurse = FALSE;
4868          terminator = (*(++ptr) == '<')? '>' : '\'';          terminator = (*(++ptr) == '<')? '>' : (*ptr == '\'')? '\'' : '}';
4869          goto NAMED_REF_OR_RECURSE;          goto NAMED_REF_OR_RECURSE;
4870          }          }
4871    
# Line 4567  This function is used during the pre-com Line 5031  This function is used during the pre-com
5031  out the amount of memory needed, as well as during the real compile phase. The  out the amount of memory needed, as well as during the real compile phase. The
5032  value of lengthptr distinguishes the two phases.  value of lengthptr distinguishes the two phases.
5033    
5034  Argument:  Arguments:
5035    options        option bits, including any changes for this subpattern    options        option bits, including any changes for this subpattern
5036    oldims         previous settings of ims option bits    oldims         previous settings of ims option bits
5037    codeptr        -> the address of the current code pointer    codeptr        -> the address of the current code pointer
5038    ptrptr         -> the address of the current pattern pointer    ptrptr         -> the address of the current pattern pointer
5039    errorcodeptr   -> pointer to error code variable    errorcodeptr   -> pointer to error code variable
5040    lookbehind     TRUE if this is a lookbehind assertion    lookbehind     TRUE if this is a lookbehind assertion
5041      reset_bracount TRUE to reset the count for each branch
5042    skipbytes      skip this many bytes at start (for brackets and OP_COND)    skipbytes      skip this many bytes at start (for brackets and OP_COND)
5043    firstbyteptr   place to put the first required character, or a negative number    firstbyteptr   place to put the first required character, or a negative number
5044    reqbyteptr     place to put the last required character, or a negative number    reqbyteptr     place to put the last required character, or a negative number
# Line 4587  Returns:         TRUE on success Line 5052  Returns:         TRUE on success
5052    
5053  static BOOL  static BOOL
5054  compile_regex(int options, int oldims, uschar **codeptr, const uschar **ptrptr,  compile_regex(int options, int oldims, uschar **codeptr, const uschar **ptrptr,
5055    int *errorcodeptr, BOOL lookbehind, int skipbytes, int *firstbyteptr,    int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes,
5056    int *reqbyteptr, branch_chain *bcptr, compile_data *cd, int *lengthptr)    int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd,
5057      int *lengthptr)
5058  {  {
5059  const uschar *ptr = *ptrptr;  const uschar *ptr = *ptrptr;
5060  uschar *code = *codeptr;  uschar *code = *codeptr;
# Line 4598  uschar *reverse_count = NULL; Line 5064  uschar *reverse_count = NULL;
5064  int firstbyte, reqbyte;  int firstbyte, reqbyte;
5065  int branchfirstbyte, branchreqbyte;  int branchfirstbyte, branchreqbyte;
5066  int length;  int length;
5067    int orig_bracount;
5068    int max_bracount;
5069  branch_chain bc;  branch_chain bc;
5070    
5071  bc.outer = bcptr;  bc.outer = bcptr;
# Line 4626  code += 1 + LINK_SIZE + skipbytes; Line 5094  code += 1 + LINK_SIZE + skipbytes;
5094    
5095  /* Loop for each alternative branch */  /* Loop for each alternative branch */
5096    
5097    orig_bracount = max_bracount = cd->bracount;
5098  for (;;)  for (;;)
5099    {    {
5100      /* For a (?| group, reset the capturing bracket count so that each branch
5101      uses the same numbers. */
5102    
5103      if (reset_bracount) cd->bracount = orig_bracount;
5104    
5105    /* Handle a change of ims options at the start of the branch */    /* Handle a change of ims options at the start of the branch */
5106    
5107    if ((options & PCRE_IMS) != oldims)    if ((options & PCRE_IMS) != oldims)
# Line 4657  for (;;) Line 5131  for (;;)
5131      return FALSE;      return FALSE;
5132      }      }
5133    
5134      /* Keep the highest bracket count in case (?| was used and some branch
5135      has fewer than the rest. */
5136    
5137      if (cd->bracount > max_bracount) max_bracount = cd->bracount;
5138    
5139    /* In the real compile phase, there is some post-processing to be done. */    /* In the real compile phase, there is some post-processing to be done. */
5140    
5141    if (lengthptr == NULL)    if (lengthptr == NULL)
# Line 4720  for (;;) Line 5199  for (;;)
5199        }        }
5200      }      }
5201    
5202    /* Reached end of expression, either ')' or end of pattern. Go back through    /* Reached end of expression, either ')' or end of pattern. In the real
5203    the alternative branches and reverse the chain of offsets, with the field in    compile phase, go back through the alternative branches and reverse the chain
5204    the BRA item now becoming an offset to the first alternative. If there are    of offsets, with the field in the BRA item now becoming an offset to the
5205    no alternatives, it points to the end of the group. The length in the    first alternative. If there are no alternatives, it points to the end of the
5206    terminating ket is always the length of the whole bracketed item. If any of    group. The length in the terminating ket is always the length of the whole
5207    the ims options were changed inside the group, compile a resetting op-code    bracketed item. If any of the ims options were changed inside the group,
5208    following, except at the very end of the pattern. Return leaving the pointer    compile a resetting op-code following, except at the very end of the pattern.
5209    at the terminating char. */    Return leaving the pointer at the terminating char. */
5210    
5211    if (*ptr != '|')    if (*ptr != '|')
5212      {      {
5213      int branch_length = code - last_branch;      if (lengthptr == NULL)
     do  
5214        {        {
5215        int prev_length = GET(last_branch, 1);        int branch_length = code - last_branch;
5216        PUT(last_branch, 1, branch_length);        do
5217        branch_length = prev_length;          {
5218        last_branch -= branch_length;          int prev_length = GET(last_branch, 1);
5219            PUT(last_branch, 1, branch_length);
5220            branch_length = prev_length;
5221            last_branch -= branch_length;
5222            }
5223          while (branch_length > 0);
5224        }        }
     while (branch_length > 0);  
5225    
5226      /* Fill in the ket */      /* Fill in the ket */
5227    
# Line 4756  for (;;) Line 5238  for (;;)
5238        length += 2;        length += 2;
5239        }        }
5240    
5241        /* Retain the highest bracket number, in case resetting was used. */
5242    
5243        cd->bracount = max_bracount;
5244    
5245      /* Set values to pass back */      /* Set values to pass back */
5246    
5247      *codeptr = code;      *codeptr = code;
5248      *ptrptr = ptr;      *ptrptr = ptr;
5249      *firstbyteptr = firstbyte;      *firstbyteptr = firstbyte;
5250      *reqbyteptr = reqbyte;      *reqbyteptr = reqbyte;
5251      if (lengthptr != NULL) *lengthptr += length;      if (lengthptr != NULL)
5252          {
5253          if (OFLOW_MAX - *lengthptr < length)
5254            {
5255            *errorcodeptr = ERR20;
5256            return FALSE;
5257            }
5258          *lengthptr += length;
5259          }
5260      return TRUE;      return TRUE;
5261      }      }
5262    
5263    /* Another branch follows; insert an "or" node. Its length field points back    /* Another branch follows. In the pre-compile phase, we can move the code
5264      pointer back to where it was for the start of the first branch. (That is,
5265      pretend that each branch is the only one.)
5266    
5267      In the real compile phase, insert an ALT node. Its length field points back
5268    to the previous branch while the bracket remains open. At the end the chain    to the previous branch while the bracket remains open. At the end the chain
5269    is reversed. It's done like this so that the start of the bracket has a    is reversed. It's done like this so that the start of the bracket has a
5270    zero offset until it is closed, making it possible to detect recursion. */    zero offset until it is closed, making it possible to detect recursion. */
5271    
5272    *code = OP_ALT;    if (lengthptr != NULL)
5273    PUT(code, 1, code - last_branch);      {
5274    bc.current = last_branch = code;      code = *codeptr + 1 + LINK_SIZE + skipbytes;
5275    code += 1 + LINK_SIZE;      length += 1 + LINK_SIZE;
5276        }
5277      else
5278        {
5279        *code = OP_ALT;
5280        PUT(code, 1, code - last_branch);
5281        bc.current = last_branch = code;
5282        code += 1 + LINK_SIZE;
5283        }
5284    
5285    ptr++;    ptr++;
   length += 1 + LINK_SIZE;  
5286    }    }
5287  /* Control never reaches here */  /* Control never reaches here */
5288  }  }
# Line 5043  Returns:        pointer to compiled data Line 5549  Returns:        pointer to compiled data
5549                  with errorptr and erroroffset set                  with errorptr and erroroffset set
5550  */  */
5551    
5552  PCRE_DATA_SCOPE pcre *  PCRE_EXP_DEFN pcre *
5553  pcre_compile(const char *pattern, int options, const char **errorptr,  pcre_compile(const char *pattern, int options, const char **errorptr,
5554    int *erroroffset, const unsigned char *tables)    int *erroroffset, const unsigned char *tables)
5555  {  {
# Line 5051  return pcre_compile2(pattern, options, N Line 5557  return pcre_compile2(pattern, options, N
5557  }  }
5558    
5559    
5560  PCRE_DATA_SCOPE pcre *  PCRE_EXP_DEFN pcre *
5561  pcre_compile2(const char *pattern, int options, int *errorcodeptr,  pcre_compile2(const char *pattern, int options, int *errorcodeptr,
5562    const char **errorptr, int *erroroffset, const unsigned char *tables)    const char **errorptr, int *erroroffset, const unsigned char *tables)
5563  {  {
# Line 5100  if (errorcodeptr != NULL) *errorcodeptr Line 5606  if (errorcodeptr != NULL) *errorcodeptr
5606  if (erroroffset == NULL)  if (erroroffset == NULL)
5607    {    {
5608    errorcode = ERR16;    errorcode = ERR16;
5609    goto PCRE_EARLY_ERROR_RETURN;    goto PCRE_EARLY_ERROR_RETURN2;
5610    }    }
5611    
5612  *erroroffset = 0;  *erroroffset = 0;
# Line 5113  if (utf8 && (options & PCRE_NO_UTF8_CHEC Line 5619  if (utf8 && (options & PCRE_NO_UTF8_CHEC
5619       (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0)       (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0)
5620    {    {
5621    errorcode = ERR44;    errorcode = ERR44;
5622    goto PCRE_UTF8_ERROR_RETURN;    goto PCRE_EARLY_ERROR_RETURN2;
5623    }    }
5624  #else  #else
5625  if ((options & PCRE_UTF8) != 0)  if ((options & PCRE_UTF8) != 0)
# Line 5138  cd->cbits = tables + cbits_offset; Line 5644  cd->cbits = tables + cbits_offset;
5644  cd->ctypes = tables + ctypes_offset;  cd->ctypes = tables + ctypes_offset;
5645    
5646  /* Handle different types of newline. The three bits give seven cases. The  /* Handle different types of newline. The three bits give seven cases. The
5647  current code allows for fixed one- or two-byte sequences, plus "any". */  current code allows for fixed one- or two-byte sequences, plus "any" and
5648    "anycrlf". */
5649    
5650  switch (options & (PCRE_NEWLINE_CRLF | PCRE_NEWLINE_ANY))  switch (options & (PCRE_NEWLINE_CRLF | PCRE_NEWLINE_ANY))
5651    {    {
# Line 5148  switch (options & (PCRE_NEWLINE_CRLF | P Line 5655  switch (options & (PCRE_NEWLINE_CRLF | P
5655    case PCRE_NEWLINE_CR+    case PCRE_NEWLINE_CR+
5656         PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;         PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;
5657    case PCRE_NEWLINE_ANY: newline = -1; break;    case PCRE_NEWLINE_ANY: newline = -1; break;
5658      case PCRE_NEWLINE_ANYCRLF: newline = -2; break;
5659    default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;    default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;
5660    }    }
5661    
5662  if (newline < 0)  if (newline == -2)
5663      {
5664      cd->nltype = NLTYPE_ANYCRLF;
5665      }
5666    else if (newline < 0)
5667    {    {
5668    cd->nltype = NLTYPE_ANY;    cd->nltype = NLTYPE_ANY;
5669    }    }
# Line 5212  outside can help speed up starting point Line 5724  outside can help speed up starting point
5724  code = cworkspace;  code = cworkspace;
5725  *code = OP_BRA;  *code = OP_BRA;
5726  (void)compile_regex(cd->external_options, cd->external_options & PCRE_IMS,  (void)compile_regex(cd->external_options, cd->external_options & PCRE_IMS,
5727    &code, &ptr, &errorcode, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, &length);    &code, &ptr, &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd,
5728      &length);
5729  if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN;  if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN;
5730    
5731  DPRINTF(("end pre-compile: length=%d workspace=%d\n", length,  DPRINTF(("end pre-compile: length=%d workspace=%d\n", length,
# Line 5271  cd->start_code = codestart; Line 5784  cd->start_code = codestart;
5784  cd->hwm = cworkspace;  cd->hwm = cworkspace;
5785  cd->req_varyopt = 0;  cd->req_varyopt = 0;
5786  cd->nopartial = FALSE;  cd->nopartial = FALSE;
5787    cd->had_accept = FALSE;
5788    
5789  /* Set up a starting, non-extracting bracket, then compile the expression. On  /* Set up a starting, non-extracting bracket, then compile the expression. On
5790  error, errorcode will be set non-zero, so we don't need to look at the result  error, errorcode will be set non-zero, so we don't need to look at the result
# Line 5280  ptr = (const uschar *)pattern; Line 5794  ptr = (const uschar *)pattern;
5794  code = (uschar *)codestart;  code = (uschar *)codestart;
5795  *code = OP_BRA;  *code = OP_BRA;
5796  (void)compile_regex(re->options, re->options & PCRE_IMS, &code, &ptr,  (void)compile_regex(re->options, re->options & PCRE_IMS, &code, &ptr,
5797    &errorcode, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, NULL);    &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, NULL);
5798  re->top_bracket = cd->bracount;  re->top_bracket = cd->bracount;
5799  re->top_backref = cd->top_backref;  re->top_backref = cd->top_backref;
5800    
5801  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
5802    if (cd->had_accept) reqbyte = -1;   /* Must disable after (*ACCEPT) */
5803    
5804  /* If not reached end of pattern on success, there's an excess bracket. */  /* If not reached end of pattern on success, there's an excess bracket. */
5805    
# Line 5325  if (errorcode != 0) Line 5840  if (errorcode != 0)
5840    (pcre_free)(re);    (pcre_free)(re);
5841    PCRE_EARLY_ERROR_RETURN:    PCRE_EARLY_ERROR_RETURN:
5842    *erroroffset = ptr - (const uschar *)pattern;    *erroroffset = ptr - (const uschar *)pattern;
5843  #ifdef SUPPORT_UTF8    PCRE_EARLY_ERROR_RETURN2:
   PCRE_UTF8_ERROR_RETURN:  
 #endif  
5844    *errorptr = error_texts[errorcode];    *errorptr = error_texts[errorcode];
5845    if (errorcodeptr != NULL) *errorcodeptr = errorcode;    if (errorcodeptr != NULL) *errorcodeptr = errorcode;
5846    return NULL;    return NULL;
# Line 5417  if ((re->options & PCRE_REQCHSET) != 0) Line 5930  if ((re->options & PCRE_REQCHSET) != 0)
5930      else printf("Req char = \\x%02x%s\n", ch, caseless);      else printf("Req char = \\x%02x%s\n", ch, caseless);
5931    }    }
5932    
5933  pcre_printint(re, stdout);  pcre_printint(re, stdout, TRUE);
5934    
5935  /* This check is done here in the debugging case so that the code that  /* This check is done here in the debugging case so that the code that
5936  was compiled can be seen. */  was compiled can be seen. */

Legend:
Removed from v.107  
changed lines
  Added in v.215

  ViewVC Help
Powered by ViewVC 1.1.5