| 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-2009 University of Cambridge |
Copyright (c) 1997-2010 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 |
| 53 |
#include "pcre_internal.h" |
#include "pcre_internal.h" |
| 54 |
|
|
| 55 |
|
|
| 56 |
/* When DEBUG is defined, we need the pcre_printint() function, which is also |
/* When PCRE_DEBUG is defined, we need the pcre_printint() function, which is |
| 57 |
used by pcretest. DEBUG is not defined when building a production library. */ |
also used by pcretest. PCRE_DEBUG is not defined when building a production |
| 58 |
|
library. */ |
| 59 |
|
|
| 60 |
#ifdef DEBUG |
#ifdef PCRE_DEBUG |
| 61 |
#include "pcre_printint.src" |
#include "pcre_printint.src" |
| 62 |
#endif |
#endif |
| 63 |
|
|
| 1995 |
could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, |
could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, |
| 1996 |
BOOL utf8) |
BOOL utf8) |
| 1997 |
{ |
{ |
| 1998 |
while (bcptr != NULL && bcptr->current >= code) |
while (bcptr != NULL && bcptr->current_branch >= code) |
| 1999 |
{ |
{ |
| 2000 |
if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE; |
if (!could_be_empty_branch(bcptr->current_branch, endcode, utf8)) |
| 2001 |
|
return FALSE; |
| 2002 |
bcptr = bcptr->outer; |
bcptr = bcptr->outer; |
| 2003 |
} |
} |
| 2004 |
return TRUE; |
return TRUE; |
| 2660 |
uschar *utf8_char = NULL; |
uschar *utf8_char = NULL; |
| 2661 |
#endif |
#endif |
| 2662 |
|
|
| 2663 |
#ifdef DEBUG |
#ifdef PCRE_DEBUG |
| 2664 |
if (lengthptr != NULL) DPRINTF((">> start branch\n")); |
if (lengthptr != NULL) DPRINTF((">> start branch\n")); |
| 2665 |
#endif |
#endif |
| 2666 |
|
|
| 2719 |
|
|
| 2720 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
| 2721 |
{ |
{ |
| 2722 |
#ifdef DEBUG |
#ifdef PCRE_DEBUG |
| 2723 |
if (code > cd->hwm) cd->hwm = code; /* High water info */ |
if (code > cd->hwm) cd->hwm = code; /* High water info */ |
| 2724 |
#endif |
#endif |
| 2725 |
if (code > cd->start_workspace + COMPILE_WORK_SIZE) /* Check for overrun */ |
if (code > cd->start_workspace + COMPILE_WORK_SIZE) /* Check for overrun */ |
| 4215 |
{ |
{ |
| 4216 |
/* 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 |
| 4217 |
just adjust the length as if we had. Do some paranoid checks for |
just adjust the length as if we had. Do some paranoid checks for |
| 4218 |
potential integer overflow. */ |
potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit |
| 4219 |
|
integer type when available, otherwise double. */ |
| 4220 |
|
|
| 4221 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
| 4222 |
{ |
{ |
| 4223 |
int delta = (repeat_min - 1)*length_prevgroup; |
int delta = (repeat_min - 1)*length_prevgroup; |
| 4224 |
if ((double)(repeat_min - 1)*(double)length_prevgroup > |
if ((INT64_OR_DOUBLE)(repeat_min - 1)* |
| 4225 |
(double)INT_MAX || |
(INT64_OR_DOUBLE)length_prevgroup > |
| 4226 |
|
(INT64_OR_DOUBLE)INT_MAX || |
| 4227 |
OFLOW_MAX - *lengthptr < delta) |
OFLOW_MAX - *lengthptr < delta) |
| 4228 |
{ |
{ |
| 4229 |
*errorcodeptr = ERR20; |
*errorcodeptr = ERR20; |
| 4269 |
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 |
| 4270 |
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 |
| 4271 |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some |
| 4272 |
paranoid checks to avoid integer overflow. */ |
paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type is |
| 4273 |
|
a 64-bit integer type when available, otherwise double. */ |
| 4274 |
|
|
| 4275 |
if (lengthptr != NULL && repeat_max > 0) |
if (lengthptr != NULL && repeat_max > 0) |
| 4276 |
{ |
{ |
| 4277 |
int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
| 4278 |
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
| 4279 |
if ((double)repeat_max * |
if ((INT64_OR_DOUBLE)repeat_max * |
| 4280 |
(double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) |
(INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) |
| 4281 |
> (double)INT_MAX || |
> (INT64_OR_DOUBLE)INT_MAX || |
| 4282 |
OFLOW_MAX - *lengthptr < delta) |
OFLOW_MAX - *lengthptr < delta) |
| 4283 |
{ |
{ |
| 4284 |
*errorcodeptr = ERR20; |
*errorcodeptr = ERR20; |
| 5792 |
branch_chain bc; |
branch_chain bc; |
| 5793 |
|
|
| 5794 |
bc.outer = bcptr; |
bc.outer = bcptr; |
| 5795 |
bc.current = code; |
bc.current_branch = code; |
| 5796 |
|
|
| 5797 |
firstbyte = reqbyte = REQ_UNSET; |
firstbyte = reqbyte = REQ_UNSET; |
| 5798 |
|
|
| 6033 |
{ |
{ |
| 6034 |
*code = OP_ALT; |
*code = OP_ALT; |
| 6035 |
PUT(code, 1, code - last_branch); |
PUT(code, 1, code - last_branch); |
| 6036 |
bc.current = last_branch = code; |
bc.current_branch = last_branch = code; |
| 6037 |
code += 1 + LINK_SIZE; |
code += 1 + LINK_SIZE; |
| 6038 |
} |
} |
| 6039 |
|
|
| 6646 |
|
|
| 6647 |
*code++ = OP_END; |
*code++ = OP_END; |
| 6648 |
|
|
| 6649 |
#ifndef DEBUG |
#ifndef PCRE_DEBUG |
| 6650 |
if (code - codestart > length) errorcode = ERR23; |
if (code - codestart > length) errorcode = ERR23; |
| 6651 |
#endif |
#endif |
| 6652 |
|
|
| 6770 |
/* Print out the compiled data if debugging is enabled. This is never the |
/* Print out the compiled data if debugging is enabled. This is never the |
| 6771 |
case when building a production library. */ |
case when building a production library. */ |
| 6772 |
|
|
| 6773 |
#ifdef DEBUG |
#ifdef PCRE_DEBUG |
| 6774 |
|
|
| 6775 |
printf("Length = %d top_bracket = %d top_backref = %d\n", |
printf("Length = %d top_bracket = %d top_backref = %d\n", |
| 6776 |
length, re->top_bracket, re->top_backref); |
length, re->top_bracket, re->top_backref); |
| 6808 |
if (errorcodeptr != NULL) *errorcodeptr = ERR23; |
if (errorcodeptr != NULL) *errorcodeptr = ERR23; |
| 6809 |
return NULL; |
return NULL; |
| 6810 |
} |
} |
| 6811 |
#endif /* DEBUG */ |
#endif /* PCRE_DEBUG */ |
| 6812 |
|
|
| 6813 |
return (pcre *)re; |
return (pcre *)re; |
| 6814 |
} |
} |