Adjust tests for workspace overflow and relevant comments in pcre2_compile.c

This commit is contained in:
Philip.Hazel 2015-11-08 14:41:34 +00:00
parent 89b1ae1c98
commit 8dcd23238a
10 changed files with 54 additions and 33 deletions

View File

@ -98,14 +98,20 @@ static BOOL
/* This value specifies the size of stack workspace, which is used in different
ways in the different pattern scans. The group-identifying pre-scan uses it to
handle nesting, and needs it to be 16-bit aligned. During the first compiling
phase, when determining how much memory is required, the regex is partly
compiled into this space, but the compiled parts are discarded as soon as they
can be, so that hopefully there will never be an overrun. The code does,
however, check for an overrun. In the real compile phase the workspace is used
for remembering data about numbered groups, provided there are not too many of
them (if there are, extra memory is acquired). For this phase the memory must
be 32-bit aligned. */
handle nesting, and needs it to be 16-bit aligned.
During the first compiling phase, when determining how much memory is required,
the regex is partly compiled into this space, but the compiled parts are
discarded as soon as they can be, so that hopefully there will never be an
overrun. The code does, however, check for an overrun, which can occur for
pathological patterns. The size of the workspace depends on LINK_SIZE because
the length of compiled items varies with this.
In the real compile phase, the workspace is used for remembering data about
numbered groups, provided there are not too many of them (if there are, extra
memory is acquired). For this phase the memory must be 32-bit aligned. Having
defined the size in code units, we set up C32_WORK_SIZE as the number of
elements in the 32-bit vector. */
#define COMPILE_WORK_SIZE (2048*LINK_SIZE) /* Size in code units */
@ -860,7 +866,7 @@ if (*code == OP_CBRA || *code == OP_CBRAPOS || *code == OP_SCBRA ||
{
group = GET2(cc, 0);
cc += IMM2_SIZE;
groupinfo = cb->groupinfo[group];
groupinfo = cb->groupinfo[group];
if ((groupinfo & GI_NOT_FIXED_LENGTH) != 0) return FFL_NOTFIXED;
if ((groupinfo & GI_SET_FIXED_LENGTH) != 0)
return groupinfo & GI_FIXED_LENGTH_MASK;
@ -909,15 +915,15 @@ for (;;)
case OP_ASSERT_ACCEPT:
if (length < 0) length = branchlength;
else if (length != branchlength) goto ISNOTFIXED;
if (*cc != OP_ALT)
if (*cc != OP_ALT)
{
if (group > 0)
{
groupinfo |= (GI_SET_FIXED_LENGTH | length);
cb->groupinfo[group] = groupinfo;
}
}
return length;
}
}
cc += 1 + LINK_SIZE;
branchlength = 0;
break;
@ -1203,7 +1209,7 @@ if (group > 0)
{
groupinfo |= GI_NOT_FIXED_LENGTH;
cb->groupinfo[group] = groupinfo;
}
}
return FFL_NOTFIXED;
}

View File

@ -353,6 +353,4 @@
/(*THEN:\[A]{65501})/expand
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand
# End of testinput11

8
testdata/testinput8 vendored
View File

@ -157,6 +157,14 @@
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
/parens_nest_limit=1000,-fullbincode
# Use "expand" to create some very long patterns with nested parentheses, in
# order to test workspace overflow. Again, this varies with code unit width,
# and even with it fails in two modes, the error offset differs.
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
/(?(1)(?1)){8,}+()/debug
abcd

6
testdata/testinput9 vendored
View File

@ -258,10 +258,4 @@
/(*MARK:a\x{100}b)z/alt_verbnames
# Use "expand" to create some very long patterns
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand
# End of testinput9

View File

@ -643,7 +643,4 @@ Subject length lower bound = 1
/(*THEN:\[A]{65501})/expand
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand
Failed: error 186 at offset 594: regular expression is too complicated
# End of testinput11

View File

@ -646,6 +646,4 @@ Subject length lower bound = 1
/(*THEN:\[A]{65501})/expand
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand
# End of testinput11

View File

@ -850,6 +850,16 @@ Memory allocation (code space): 14
/parens_nest_limit=1000,-fullbincode
Failed: error 184 at offset 1540: (?| and/or (?J: or (?x: parentheses are too deeply nested
# Use "expand" to create some very long patterns with nested parentheses, in
# order to test workspace overflow. Again, this varies with code unit width,
# and even with it fails in two modes, the error offset differs.
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
Failed: error 186 at offset 594: regular expression is too complicated
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
Failed: error 186 at offset 594: regular expression is too complicated
/(?(1)(?1)){8,}+()/debug
------------------------------------------------------------------
0 79 Bra

View File

@ -849,6 +849,14 @@ Memory allocation (code space): 28
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
/parens_nest_limit=1000,-fullbincode
# Use "expand" to create some very long patterns with nested parentheses, in
# order to test workspace overflow. Again, this varies with code unit width,
# and even with it fails in two modes, the error offset differs.
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
/(?(1)(?1)){8,}+()/debug
------------------------------------------------------------------
0 79 Bra

View File

@ -850,6 +850,15 @@ Memory allocation (code space): 10
/parens_nest_limit=1000,-fullbincode
Failed: error 184 at offset 1540: (?| and/or (?J: or (?x: parentheses are too deeply nested
# Use "expand" to create some very long patterns with nested parentheses, in
# order to test workspace overflow. Again, this varies with code unit width,
# and even with it fails in two modes, the error offset differs.
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
Failed: error 186 at offset 637: regular expression is too complicated
/(?(1)(?1)){8,}+()/debug
------------------------------------------------------------------
0 119 Bra

View File

@ -364,11 +364,4 @@ Failed: error 177 at offset 6: character code point value in \u.... sequence is
/(*MARK:a\x{100}b)z/alt_verbnames
Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
# Use "expand" to create some very long patterns
/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand
/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand
Failed: error 186 at offset 637: regular expression is too complicated
# End of testinput9