Make (*LIMIT_MATCH=) give an error and correct offsets for limit syntax errors.

This commit is contained in:
Philip.Hazel 2015-08-10 16:34:17 +00:00
parent 4b48a50281
commit f86d8d35fa
5 changed files with 24 additions and 2 deletions

View File

@ -128,6 +128,11 @@ offsets in the pattern.
33. Improve the performance of starting single character repetitions in JIT. 33. Improve the performance of starting single character repetitions in JIT.
34. (*LIMIT_MATCH=) now gives an error instead of setting the value to 0.
35. Error messages for syntax errors in *LIMIT_MATCH and *LIMIT_RECURSION now
give the right offset instead of zero.
Version 10.20 30-June-2015 Version 10.20 30-June-2015
-------------------------- --------------------------

View File

@ -7941,6 +7941,12 @@ while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS &&
case PSO_LIMR: case PSO_LIMR:
c = 0; c = 0;
pp = skipatstart; pp = skipatstart;
if (!IS_DIGIT(ptr[pp]))
{
errorcode = ERR60;
ptr += pp;
goto HAD_ERROR;
}
while (IS_DIGIT(ptr[pp])) while (IS_DIGIT(ptr[pp]))
{ {
if (c > UINT32_MAX / 10 - 1) break; /* Integer overflow */ if (c > UINT32_MAX / 10 - 1) break; /* Integer overflow */
@ -7949,6 +7955,7 @@ while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS &&
if (ptr[pp++] != CHAR_RIGHT_PARENTHESIS) if (ptr[pp++] != CHAR_RIGHT_PARENTHESIS)
{ {
errorcode = ERR60; errorcode = ERR60;
ptr += pp;
goto HAD_ERROR; goto HAD_ERROR;
} }
if (p->type == PSO_LIMM) limit_match = c; if (p->type == PSO_LIMM) limit_match = c;

4
testdata/testinput2 vendored
View File

@ -4399,4 +4399,8 @@ a random value. /Ix
/(?(1)()\983040\2)/ /(?(1)()\983040\2)/
/(*LIMIT_MATCH=)abc/
/(*CRLF)(*LIMIT_MATCH=)abc/
# End of testinput2 # End of testinput2

View File

@ -98,10 +98,10 @@ Minimum recursion limit = 10
3: ee 3: ee
/(*LIMIT_MATCH=12bc)abc/ /(*LIMIT_MATCH=12bc)abc/
Failed: error 160 at offset 0: (*VERB) not recognized or malformed Failed: error 160 at offset 17: (*VERB) not recognized or malformed
/(*LIMIT_MATCH=4294967290)abc/ /(*LIMIT_MATCH=4294967290)abc/
Failed: error 160 at offset 0: (*VERB) not recognized or malformed Failed: error 160 at offset 24: (*VERB) not recognized or malformed
/(*LIMIT_RECURSION=4294967280)abc/I /(*LIMIT_RECURSION=4294967280)abc/I
Capturing subpattern count = 0 Capturing subpattern count = 0

View File

@ -14651,4 +14651,10 @@ No match
/(?(1)()\983040\2)/ /(?(1)()\983040\2)/
Failed: error 115 at offset 13: reference to non-existent subpattern Failed: error 115 at offset 13: reference to non-existent subpattern
/(*LIMIT_MATCH=)abc/
Failed: error 160 at offset 14: (*VERB) not recognized or malformed
/(*CRLF)(*LIMIT_MATCH=)abc/
Failed: error 160 at offset 21: (*VERB) not recognized or malformed
# End of testinput2 # End of testinput2