summaryrefslogtreecommitdiff
path: root/t/re
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2017-06-16 15:46:19 +0100
committerDavid Mitchell <davem@iabyn.com>2017-06-16 15:46:19 +0100
commitbb152a4b442f7718fd37d32cc558be675e8ae1ae (patch)
treee11cac104d1b6f97cb88028da323c0c891a5cb61 /t/re
parent9a4e033ca5abe2a94a5b47e25968106278ede709 (diff)
downloadperl-bb152a4b442f7718fd37d32cc558be675e8ae1ae.tar.gz
don't call Perl_fbm_instr() with negative length
RT #131575 re_intuit_start() could calculate a maximum end position less than the current start position. This used to get rejected by fbm_intr(), until v5.23.3-110-g147f21b, which made fbm_intr() faster and removed unnecessary checks. This commits fixes re_intuit_start(), and adds an assert to fbm_intr().
Diffstat (limited to 't/re')
-rw-r--r--t/re/pat.t13
1 files changed, 12 insertions, 1 deletions
diff --git a/t/re/pat.t b/t/re/pat.t
index 3ac95e91cf..fb6d4c4a69 100644
--- a/t/re/pat.t
+++ b/t/re/pat.t
@@ -23,7 +23,7 @@ BEGIN {
skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
skip_all_without_unicode_tables();
-plan tests => 836; # Update this when adding/deleting tests.
+plan tests => 837; # Update this when adding/deleting tests.
run_tests() unless caller;
@@ -1906,6 +1906,17 @@ EOP
# [perl #129281] buffer write overflow, detected by ASAN, valgrind
fresh_perl_is('/0(?0)|^*0(?0)|^*(^*())0|/', '', {}, "don't bump whilem_c too much");
}
+
+ {
+ # RT #131575 intuit skipping back from the end to find the highest
+ # possible start point, was potentially hopping back beyond pos()
+ # and crashing by calling fbm_instr with a negative length
+
+ my $text = "=t=\x{5000}";
+ pos($text) = 3;
+ ok(scalar($text !~ m{(~*=[a-z]=)}g), "RT #131575");
+ }
+
} # End of sub run_tests
1;