/[pcre]/code/branches/pcre16/pcre_compile.c
ViewVC logotype

Diff of /code/branches/pcre16/pcre_compile.c

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

revision 180 by ph10, Wed Jun 13 10:59:18 2007 UTC revision 223 by ph10, Mon Aug 20 11:07:53 2007 UTC
# 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 62  used by pcretest. DEBUG is not defined w Line 65  used by pcretest. DEBUG is not defined w
65    
66  #define SETBIT(a,b) a[b/8] |= (1 << (b%8))  #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         *
# Line 120  static const short int escapes[] = { Line 130  static const short int escapes[] = {
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 */-ESC_H,     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,-ESC_V, -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,
# Line 130  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 203  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 239  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 248  static const char *error_texts[] = { Line 279  static const char *error_texts[] = {
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 a braced name or 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"    "(?+ 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 405  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 490  else Line 525  else
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 501  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 530  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 625  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 701  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 904  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 931  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 1059  for (;;) Line 1106  for (;;)
1106    {    {
1107    int d;    int d;
1108    register int op = *cc;    register int op = *cc;
   
1109    switch (op)    switch (op)
1110      {      {
1111      case OP_CBRA:      case OP_CBRA:
# Line 1148  for (;;) Line 1194  for (;;)
1194    
1195      case OP_TYPEEXACT:      case OP_TYPEEXACT:
1196      branchlength += GET2(cc,1);      branchlength += GET2(cc,1);
1197        if (cc[3] == OP_PROP || cc[3] == OP_NOTPROP) cc += 2;
1198      cc += 4;      cc += 4;
1199      break;      break;
1200    
# Line 1256  for (;;) Line 1303  for (;;)
1303      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1304      }      }
1305    
1306    /* In UTF-8 mode, opcodes that are followed by a character may be followed by    /* Otherwise, we can get the item's length from the table, except that for
1307    a multi-byte character. The length in the table is a minimum, so we have to    repeated character types, we have to test for \p and \P, which have an extra
1308    arrange to skip the extra bytes. */    two bytes of parameters. */
1309    
1310    else    else
1311      {      {
1312        switch(c)
1313          {
1314          case OP_TYPESTAR:
1315          case OP_TYPEMINSTAR:
1316          case OP_TYPEPLUS:
1317          case OP_TYPEMINPLUS:
1318          case OP_TYPEQUERY:
1319          case OP_TYPEMINQUERY:
1320          case OP_TYPEPOSSTAR:
1321          case OP_TYPEPOSPLUS:
1322          case OP_TYPEPOSQUERY:
1323          if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
1324          break;
1325    
1326          case OP_TYPEUPTO:
1327          case OP_TYPEMINUPTO:
1328          case OP_TYPEEXACT:
1329          case OP_TYPEPOSUPTO:
1330          if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2;
1331          break;
1332          }
1333    
1334        /* Add in the fixed length from the table */
1335    
1336      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1337    
1338      /* In UTF-8 mode, opcodes that are followed by a character may be followed by
1339      a multi-byte character. The length in the table is a minimum, so we have to
1340      arrange to skip the extra bytes. */
1341    
1342  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1343      if (utf8) switch(c)      if (utf8) switch(c)
1344        {        {
# Line 1320  for (;;) Line 1396  for (;;)
1396    
1397    if (c == OP_XCLASS) code += GET(code, 1);    if (c == OP_XCLASS) code += GET(code, 1);
1398    
1399    /* Otherwise, we get the item's length from the table. In UTF-8 mode, opcodes    /* Otherwise, we can get the item's length from the table, except that for
1400    that are followed by a character may be followed by a multi-byte character.    repeated character types, we have to test for \p and \P, which have an extra
1401    The length in the table is a minimum, so we have to arrange to skip the extra    two bytes of parameters. */
   bytes. */  
1402    
1403    else    else
1404      {      {
1405        switch(c)
1406          {
1407          case OP_TYPESTAR:
1408          case OP_TYPEMINSTAR:
1409          case OP_TYPEPLUS:
1410          case OP_TYPEMINPLUS:
1411          case OP_TYPEQUERY:
1412          case OP_TYPEMINQUERY:
1413          case OP_TYPEPOSSTAR:
1414          case OP_TYPEPOSPLUS:
1415          case OP_TYPEPOSQUERY:
1416          if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
1417          break;
1418    
1419          case OP_TYPEPOSUPTO:
1420          case OP_TYPEUPTO:
1421          case OP_TYPEMINUPTO:
1422          case OP_TYPEEXACT:
1423          if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2;
1424          break;
1425          }
1426    
1427        /* Add in the fixed length from the table */
1428    
1429      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1430    
1431        /* In UTF-8 mode, opcodes that are followed by a character may be followed
1432        by a multi-byte character. The length in the table is a minimum, so we have
1433        to arrange to skip the extra bytes. */
1434    
1435  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1436      if (utf8) switch(c)      if (utf8) switch(c)
1437        {        {
# Line 1399  for (code = first_significant_code(code Line 1503  for (code = first_significant_code(code
1503    
1504    /* For other groups, scan the branches. */    /* For other groups, scan the branches. */
1505    
1506    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE)    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND)
1507      {      {
1508      BOOL empty_branch;      BOOL empty_branch;
1509      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
# Line 1423  for (code = first_significant_code(code Line 1527  for (code = first_significant_code(code
1527    
1528    switch (c)    switch (c)
1529      {      {
1530      /* Check for quantifiers after a class */      /* Check for quantifiers after a class. XCLASS is used for classes that
1531        cannot be represented just by a bit map. This includes negated single
1532        high-valued characters. The length in _pcre_OP_lengths[] is zero; the
1533        actual length is stored in the compiled code, so we must update "code"
1534        here. */
1535    
1536  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1537      case OP_XCLASS:      case OP_XCLASS:
1538      ccode = code + GET(code, 1);      ccode = code += GET(code, 1);
1539      goto CHECK_CLASS_REPEAT;      goto CHECK_CLASS_REPEAT;
1540  #endif  #endif
1541    
# Line 2026  switch(op_code) Line 2134  switch(op_code)
2134    
2135      case ESC_W:      case ESC_W:
2136      return item <= 127 && (cd->ctypes[item] & ctype_word) != 0;      return item <= 127 && (cd->ctypes[item] & ctype_word) != 0;
2137    
2138      case ESC_h:      case ESC_h:
2139      case ESC_H:      case ESC_H:
2140      switch(item)      switch(item)
# Line 2053  switch(op_code) Line 2161  switch(op_code)
2161        return -next != ESC_h;        return -next != ESC_h;
2162        default:        default:
2163        return -next == ESC_h;        return -next == ESC_h;
2164        }        }
2165    
2166      case ESC_v:      case ESC_v:
2167      case ESC_V:      case ESC_V:
2168      switch(item)      switch(item)
# Line 2069  switch(op_code) Line 2177  switch(op_code)
2177        return -next != ESC_v;        return -next != ESC_v;
2178        default:        default:
2179        return -next == ESC_v;        return -next == ESC_v;
2180        }        }
2181    
2182      default:      default:
2183      return FALSE;      return FALSE;
# Line 2093  switch(op_code) Line 2201  switch(op_code)
2201    
2202    case OP_NOT_HSPACE:    case OP_NOT_HSPACE:
2203    return next == -ESC_h;    return next == -ESC_h;
2204    
2205    /* Can't have \S in here because VT matches \S (Perl anomaly) */    /* Can't have \S in here because VT matches \S (Perl anomaly) */
2206    case OP_VSPACE:    case OP_VSPACE:
2207    return next == -ESC_V || next == -ESC_d || next == -ESC_w;    return next == -ESC_V || next == -ESC_d || next == -ESC_w;
2208    
2209    case OP_NOT_VSPACE:    case OP_NOT_VSPACE:
2210    return next == -ESC_v;    return next == -ESC_v;
2211    
2212    case OP_WORDCHAR:    case OP_WORDCHAR:
2213    return next == -ESC_W || next == -ESC_s || next == -ESC_h || next == -ESC_v;    return next == -ESC_W || next == -ESC_s || next == -ESC_h || next == -ESC_v;
2214    
2215    case OP_NOT_WORDCHAR:    case OP_NOT_WORDCHAR:
2216    return next == -ESC_w || next == -ESC_d;    return next == -ESC_w || next == -ESC_d;
2217    
2218    default:    default:
2219    return FALSE;    return FALSE;
2220    }    }
# Line 2255  for (;; ptr++) Line 2363  for (;; ptr++)
2363      */      */
2364    
2365      if (code < last_code) code = last_code;      if (code < last_code) code = last_code;
2366    
2367        /* Paranoid check for integer overflow */
2368    
2369        if (OFLOW_MAX - *lengthptr < code - last_code)
2370          {
2371          *errorcodeptr = ERR20;
2372          goto FAILED;
2373          }
2374    
2375      *lengthptr += code - last_code;      *lengthptr += code - last_code;
2376      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));
2377    
# Line 2367  for (;; ptr++) Line 2484  for (;; ptr++)
2484      *ptrptr = ptr;      *ptrptr = ptr;
2485      if (lengthptr != NULL)      if (lengthptr != NULL)
2486        {        {
2487          if (OFLOW_MAX - *lengthptr < code - last_code)
2488            {
2489            *errorcodeptr = ERR20;
2490            goto FAILED;
2491            }
2492        *lengthptr += code - last_code;   /* To include callout length */        *lengthptr += code - last_code;   /* To include callout length */
2493        DPRINTF((">> end branch\n"));        DPRINTF((">> end branch\n"));
2494        }        }
# Line 2429  for (;; ptr++) Line 2551  for (;; ptr++)
2551        goto FAILED;        goto FAILED;
2552        }        }
2553    
2554      /* 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,
2555        if the first few characters (either before or after ^) are \Q\E or \E we
2556        skip them too. This makes for compatibility with Perl. */
2557    
2558      if ((c = *(++ptr)) == '^')      negate_class = FALSE;
2559        for (;;)
2560        {        {
       negate_class = TRUE;  
2561        c = *(++ptr);        c = *(++ptr);
2562        }        if (c == '\\')
2563      else          {
2564        {          if (ptr[1] == 'E') ptr++;
2565        negate_class = FALSE;            else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3;
2566                else break;
2567            }
2568          else if (!negate_class && c == '^')
2569            negate_class = TRUE;
2570          else break;
2571        }        }
2572    
2573      /* 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 2579  for (;; ptr++) Line 2708  for (;; ptr++)
2708        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
2709        case. Inside a class (and only there) it is treated as backspace.        case. Inside a class (and only there) it is treated as backspace.
2710        Elsewhere it marks a word boundary. Other escapes have preset maps ready        Elsewhere it marks a word boundary. Other escapes have preset maps ready
2711        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
2712        character in them, so set class_charcount bigger than one. */        character in them, so set class_charcount bigger than one. */
2713    
2714        if (c == '\\')        if (c == '\\')
# Line 2599  for (;; ptr++) Line 2728  for (;; ptr++)
2728            else inescq = TRUE;            else inescq = TRUE;
2729            continue;            continue;
2730            }            }
2731            else if (-c == ESC_E) continue;  /* Ignore orphan \E */
2732    
2733          if (c < 0)          if (c < 0)
2734            {            {
# Line 3046  for (;; ptr++) Line 3176  for (;; ptr++)
3176        }        }
3177    
3178      /* If class_charcount is 1, we saw precisely one character whose value is      /* If class_charcount is 1, we saw precisely one character whose value is
3179      less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we      less than 256. As long as there were no characters >= 128 and there was no
3180      can optimize the negative case only if there were no characters >= 128      use of \p or \P, in other words, no use of any XCLASS features, we can
3181      because OP_NOT and the related opcodes like OP_NOTSTAR operate on      optimize.
3182      single-bytes only. This is an historical hangover. Maybe one day we can  
3183      tidy these opcodes to handle multi-byte characters.      In UTF-8 mode, we can optimize the negative case only if there were no
3184        characters >= 128 because OP_NOT and the related opcodes like OP_NOTSTAR
3185        operate on single-bytes only. This is an historical hangover. Maybe one day
3186        we can tidy these opcodes to handle multi-byte characters.
3187    
3188      The optimization throws away the bit map. We turn the item into a      The optimization throws away the bit map. We turn the item into a
3189      1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note      1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note
# Line 3060  for (;; ptr++) Line 3193  for (;; ptr++)
3193      reqbyte, save the previous value for reinstating. */      reqbyte, save the previous value for reinstating. */
3194    
3195  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
3196      if (class_charcount == 1 &&      if (class_charcount == 1 && !class_utf8 &&
3197            (!utf8 ||        (!utf8 || !negate_class || class_lastchar < 128))
           (!class_utf8 && (!negate_class || class_lastchar < 128))))  
   
3198  #else  #else
3199      if (class_charcount == 1)      if (class_charcount == 1)
3200  #endif  #endif
# Line 3521  for (;; ptr++) Line 3652  for (;; ptr++)
3652          goto FAILED;          goto FAILED;
3653          }          }
3654    
       /* This is a paranoid check to stop integer overflow later on */  
   
       if (len > MAX_DUPLENGTH)  
         {  
         *errorcodeptr = ERR50;  
         goto FAILED;  
         }  
   
3655        /* 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
3656        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
3657        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 3617  for (;; ptr++) Line 3740  for (;; ptr++)
3740          if (repeat_min > 1)          if (repeat_min > 1)
3741            {            {
3742            /* 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
3743            just adjust the length as if we had. */            just adjust the length as if we had. Do some paranoid checks for
3744              potential integer overflow. */
3745    
3746            if (lengthptr != NULL)            if (lengthptr != NULL)
3747              *lengthptr += (repeat_min - 1)*length_prevgroup;              {
3748                int delta = (repeat_min - 1)*length_prevgroup;
3749                if ((double)(repeat_min - 1)*(double)length_prevgroup >
3750                                                                (double)INT_MAX ||
3751                    OFLOW_MAX - *lengthptr < delta)
3752                  {
3753                  *errorcodeptr = ERR20;
3754                  goto FAILED;
3755                  }
3756                *lengthptr += delta;
3757                }
3758    
3759            /* This is compiling for real */            /* This is compiling for real */
3760    
# Line 3658  for (;; ptr++) Line 3792  for (;; ptr++)
3792          /* 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
3793          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
3794          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
3795          add 2 + 2*LINKSIZE to allow for the nesting that occurs. */          add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some
3796            paranoid checks to avoid integer overflow. */
3797    
3798          if (lengthptr != NULL && repeat_max > 0)          if (lengthptr != NULL && repeat_max > 0)
3799            *lengthptr += repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -            {
3800              2 - 2*LINK_SIZE;  /* Last one doesn't nest */            int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
3801                          2 - 2*LINK_SIZE;   /* Last one doesn't nest */
3802              if ((double)repeat_max *
3803                    (double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)
3804                      > (double)INT_MAX ||
3805                  OFLOW_MAX - *lengthptr < delta)
3806                {
3807                *errorcodeptr = ERR20;
3808                goto FAILED;
3809                }
3810              *lengthptr += delta;
3811              }
3812    
3813          /* This is compiling for real */          /* This is compiling for real */
3814    
# Line 3814  for (;; ptr++) Line 3960  for (;; ptr++)
3960      /* ===================================================================*/      /* ===================================================================*/
3961      /* Start of nested parenthesized sub-expression, or comment or lookahead or      /* Start of nested parenthesized sub-expression, or comment or lookahead or
3962      lookbehind or option setting or condition or all the other extended      lookbehind or option setting or condition or all the other extended
3963      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. */  
3964    
3965      case '(':      case '(':
3966      newoptions = options;      newoptions = options;
# Line 3825  for (;; ptr++) Line 3969  for (;; ptr++)
3969      save_hwm = cd->hwm;      save_hwm = cd->hwm;
3970      reset_bracount = FALSE;      reset_bracount = FALSE;
3971    
3972      if (*(++ptr) == '?')      /* First deal with various "verbs" that can be introduced by '*'. */
3973    
3974        if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
3975          {
3976          int i, namelen;
3977          const uschar *name = ++ptr;
3978          previous = NULL;
3979          while ((cd->ctypes[*++ptr] & ctype_letter) != 0);
3980          if (*ptr == ':')
3981            {
3982            *errorcodeptr = ERR59;   /* Not supported */
3983            goto FAILED;
3984            }
3985          if (*ptr != ')')
3986            {
3987            *errorcodeptr = ERR60;
3988            goto FAILED;
3989            }
3990          namelen = ptr - name;
3991          for (i = 0; i < verbcount; i++)
3992            {
3993            if (namelen == verbs[i].len &&
3994                strncmp((char *)name, verbs[i].name, namelen) == 0)
3995              {
3996              *code = verbs[i].op;
3997              if (*code++ == OP_ACCEPT) cd->had_accept = TRUE;
3998              break;
3999              }
4000            }
4001          if (i < verbcount) continue;
4002          *errorcodeptr = ERR60;
4003          goto FAILED;
4004          }
4005    
4006        /* Deal with the extended parentheses; all are introduced by '?', and the
4007        appearance of any of them means that this is not a capturing group. */
4008    
4009        else if (*ptr == '?')
4010        {        {
4011        int i, set, unset, namelen;        int i, set, unset, namelen;
4012        int *optset;        int *optset;
# Line 4067  for (;; ptr++) Line 4248  for (;; ptr++)
4248    
4249          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4250          case '!':                 /* Negative lookahead */          case '!':                 /* Negative lookahead */
         bravalue = OP_ASSERT_NOT;  
4251          ptr++;          ptr++;
4252            if (*ptr == ')')          /* Optimize (?!) */
4253              {
4254              *code++ = OP_FAIL;
4255              previous = NULL;
4256              continue;
4257              }
4258            bravalue = OP_ASSERT_NOT;
4259          break;          break;
4260    
4261    
# Line 4617  for (;; ptr++) Line 4804  for (;; ptr++)
4804        goto FAILED;        goto FAILED;
4805        }        }
4806    
4807      /* In the pre-compile phase, update the length by the length of the nested      /* In the pre-compile phase, update the length by the length of the group,
4808      group, less the brackets at either end. Then reduce the compiled code to      less the brackets at either end. Then reduce the compiled code to just a
4809      just the brackets so that it doesn't use much memory if it is duplicated by      set of non-capturing brackets so that it doesn't use much memory if it is
4810      a quantifier. */      duplicated by a quantifier.*/
4811    
4812      if (lengthptr != NULL)      if (lengthptr != NULL)
4813        {        {
4814          if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE)
4815            {
4816            *errorcodeptr = ERR20;
4817            goto FAILED;
4818            }
4819        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
4820        code++;        *code++ = OP_BRA;
4821        PUTINC(code, 0, 1 + LINK_SIZE);        PUTINC(code, 0, 1 + LINK_SIZE);
4822        *code++ = OP_KET;        *code++ = OP_KET;
4823        PUTINC(code, 0, 1 + LINK_SIZE);        PUTINC(code, 0, 1 + LINK_SIZE);
4824          break;    /* No need to waste time with special character handling */
4825        }        }
4826    
4827      /* Otherwise update the main code pointer to the end of the group. */      /* Otherwise update the main code pointer to the end of the group. */
4828    
4829      else code = tempcode;      code = tempcode;
4830    
4831      /* For a DEFINE group, required and first character settings are not      /* For a DEFINE group, required and first character settings are not
4832      relevant. */      relevant. */
# Line 5119  for (;;) Line 5312  for (;;)
5312      *ptrptr = ptr;      *ptrptr = ptr;
5313      *firstbyteptr = firstbyte;      *firstbyteptr = firstbyte;
5314      *reqbyteptr = reqbyte;      *reqbyteptr = reqbyte;
5315      if (lengthptr != NULL) *lengthptr += length;      if (lengthptr != NULL)
5316          {
5317          if (OFLOW_MAX - *lengthptr < length)
5318            {
5319            *errorcodeptr = ERR20;
5320            return FALSE;
5321            }
5322          *lengthptr += length;
5323          }
5324      return TRUE;      return TRUE;
5325      }      }
5326    
# Line 5647  cd->start_code = codestart; Line 5848  cd->start_code = codestart;
5848  cd->hwm = cworkspace;  cd->hwm = cworkspace;
5849  cd->req_varyopt = 0;  cd->req_varyopt = 0;
5850  cd->nopartial = FALSE;  cd->nopartial = FALSE;
5851    cd->had_accept = FALSE;
5852    
5853  /* Set up a starting, non-extracting bracket, then compile the expression. On  /* Set up a starting, non-extracting bracket, then compile the expression. On
5854  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 5661  re->top_bracket = cd->bracount; Line 5863  re->top_bracket = cd->bracount;
5863  re->top_backref = cd->top_backref;  re->top_backref = cd->top_backref;
5864    
5865  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
5866    if (cd->had_accept) reqbyte = -1;   /* Must disable after (*ACCEPT) */
5867    
5868  /* 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. */
5869    

Legend:
Removed from v.180  
changed lines
  Added in v.223

  ViewVC Help
Powered by ViewVC 1.1.5