This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #133871] heap-buffer-overflow in S_reginsert
authorKarl Williamson <khw@cpan.org>
Thu, 14 Mar 2019 01:11:46 +0000 (19:11 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 14 Mar 2019 01:27:49 +0000 (19:27 -0600)
commite0814905161f8420d3be47dd3883b1f3c9590a82
tree2e82dd02583f67fa6a63b41efeaac8d32101f225
parentb76e1c044f939bf713dab1a40f484ed2b22561a7
PATCH: [perl #133871] heap-buffer-overflow in S_reginsert

The regex compiler was written assuming it knew how many parentheses
pairs there were at code generation time.  When I converted to a single
pass in 7c932d07cab18751bfc7515b4320436273a459e2, most things were
straight forward to not have to know this number, but there were a few
where it was non-trivial (for me anyway) to figure out how to handle.
So I punted on these and do a second pass when these are encountered.
There are few of them and are less commonly used, namely (?R), (?|...)
and forward references to groups (which most commonly will end up being
a syntax error anyway).

The fix in this commit is to avoid doing some parentheses relocations
when a regnode is inserted when it is known that the parentheses counts
are unreliable (during initial parsing of one of these tricky
constructs).  The code in the ticket is using a branch reset '(?|...)'.
A second pass will get done, and the insert properly handled then, after
the counts are reliable.
regcomp.c
t/re/pat.t