| 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 * |
| 213 |
"missing ) after comment", |
"missing ) after comment", |
| 214 |
"parentheses nested too deeply", /** DEAD **/ |
"parentheses nested too deeply", /** DEAD **/ |
| 215 |
/* 20 */ |
/* 20 */ |
| 216 |
"regular expression too large", |
"regular expression is too large", |
| 217 |
"failed to get memory", |
"failed to get memory", |
| 218 |
"unmatched parentheses", |
"unmatched parentheses", |
| 219 |
"internal error: code overflow", |
"internal error: code overflow", |
| 249 |
"subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", |
"subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", |
| 250 |
"too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", |
"too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", |
| 251 |
/* 50 */ |
/* 50 */ |
| 252 |
"repeated subpattern is too long", |
"repeated subpattern is too long", /** DEAD **/ |
| 253 |
"octal value is greater than \\377 (not in UTF-8 mode)", |
"octal value is greater than \\377 (not in UTF-8 mode)", |
| 254 |
"internal error: overran compiling workspace", |
"internal error: overran compiling workspace", |
| 255 |
"internal error: previously-checked referenced subpattern not found", |
"internal error: previously-checked referenced subpattern not found", |
| 2265 |
*/ |
*/ |
| 2266 |
|
|
| 2267 |
if (code < last_code) code = last_code; |
if (code < last_code) code = last_code; |
| 2268 |
|
|
| 2269 |
|
/* Paranoid check for integer overflow */ |
| 2270 |
|
|
| 2271 |
|
if (OFLOW_MAX - *lengthptr < code - last_code) |
| 2272 |
|
{ |
| 2273 |
|
*errorcodeptr = ERR20; |
| 2274 |
|
goto FAILED; |
| 2275 |
|
} |
| 2276 |
|
|
| 2277 |
*lengthptr += code - last_code; |
*lengthptr += code - last_code; |
| 2278 |
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)); |
| 2279 |
|
|
| 2386 |
*ptrptr = ptr; |
*ptrptr = ptr; |
| 2387 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
| 2388 |
{ |
{ |
| 2389 |
|
if (OFLOW_MAX - *lengthptr < code - last_code) |
| 2390 |
|
{ |
| 2391 |
|
*errorcodeptr = ERR20; |
| 2392 |
|
goto FAILED; |
| 2393 |
|
} |
| 2394 |
*lengthptr += code - last_code; /* To include callout length */ |
*lengthptr += code - last_code; /* To include callout length */ |
| 2395 |
DPRINTF((">> end branch\n")); |
DPRINTF((">> end branch\n")); |
| 2396 |
} |
} |
| 3545 |
goto FAILED; |
goto FAILED; |
| 3546 |
} |
} |
| 3547 |
|
|
|
/* This is a paranoid check to stop integer overflow later on */ |
|
|
|
|
|
if (len > MAX_DUPLENGTH) |
|
|
{ |
|
|
*errorcodeptr = ERR50; |
|
|
goto FAILED; |
|
|
} |
|
|
|
|
| 3548 |
/* 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 |
| 3549 |
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 |
| 3550 |
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 |
| 3633 |
if (repeat_min > 1) |
if (repeat_min > 1) |
| 3634 |
{ |
{ |
| 3635 |
/* 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 |
| 3636 |
just adjust the length as if we had. */ |
just adjust the length as if we had. Do some paranoid checks for |
| 3637 |
|
potential integer overflow. */ |
| 3638 |
|
|
| 3639 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
| 3640 |
*lengthptr += (repeat_min - 1)*length_prevgroup; |
{ |
| 3641 |
|
int delta = (repeat_min - 1)*length_prevgroup; |
| 3642 |
|
if ((double)(repeat_min - 1)*(double)length_prevgroup > |
| 3643 |
|
(double)INT_MAX || |
| 3644 |
|
OFLOW_MAX - *lengthptr < delta) |
| 3645 |
|
{ |
| 3646 |
|
*errorcodeptr = ERR20; |
| 3647 |
|
goto FAILED; |
| 3648 |
|
} |
| 3649 |
|
*lengthptr += delta; |
| 3650 |
|
} |
| 3651 |
|
|
| 3652 |
/* This is compiling for real */ |
/* This is compiling for real */ |
| 3653 |
|
|
| 3685 |
/* 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 |
| 3686 |
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 |
| 3687 |
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 |
| 3688 |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. */ |
add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some |
| 3689 |
|
paranoid checks to avoid integer overflow. */ |
| 3690 |
|
|
| 3691 |
if (lengthptr != NULL && repeat_max > 0) |
if (lengthptr != NULL && repeat_max > 0) |
| 3692 |
*lengthptr += repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
{ |
| 3693 |
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - |
| 3694 |
|
2 - 2*LINK_SIZE; /* Last one doesn't nest */ |
| 3695 |
|
if ((double)repeat_max * |
| 3696 |
|
(double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) |
| 3697 |
|
> (double)INT_MAX || |
| 3698 |
|
OFLOW_MAX - *lengthptr < delta) |
| 3699 |
|
{ |
| 3700 |
|
*errorcodeptr = ERR20; |
| 3701 |
|
goto FAILED; |
| 3702 |
|
} |
| 3703 |
|
*lengthptr += delta; |
| 3704 |
|
} |
| 3705 |
|
|
| 3706 |
/* This is compiling for real */ |
/* This is compiling for real */ |
| 3707 |
|
|
| 4663 |
|
|
| 4664 |
if (lengthptr != NULL) |
if (lengthptr != NULL) |
| 4665 |
{ |
{ |
| 4666 |
|
if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE) |
| 4667 |
|
{ |
| 4668 |
|
*errorcodeptr = ERR20; |
| 4669 |
|
goto FAILED; |
| 4670 |
|
} |
| 4671 |
*lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; |
*lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; |
| 4672 |
code++; |
code++; |
| 4673 |
PUTINC(code, 0, 1 + LINK_SIZE); |
PUTINC(code, 0, 1 + LINK_SIZE); |
| 5163 |
*ptrptr = ptr; |
*ptrptr = ptr; |
| 5164 |
*firstbyteptr = firstbyte; |
*firstbyteptr = firstbyte; |
| 5165 |
*reqbyteptr = reqbyte; |
*reqbyteptr = reqbyte; |
| 5166 |
if (lengthptr != NULL) *lengthptr += length; |
if (lengthptr != NULL) |
| 5167 |
|
{ |
| 5168 |
|
if (OFLOW_MAX - *lengthptr < length) |
| 5169 |
|
{ |
| 5170 |
|
*errorcodeptr = ERR20; |
| 5171 |
|
return FALSE; |
| 5172 |
|
} |
| 5173 |
|
*lengthptr += length; |
| 5174 |
|
} |
| 5175 |
return TRUE; |
return TRUE; |
| 5176 |
} |
} |
| 5177 |
|
|