This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #118175] prevent a similar overflow for CANY
authorTony Cook <tony@develop-help.com>
Sat, 1 Jun 2013 01:10:39 +0000 (11:10 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 3 Jun 2013 12:05:27 +0000 (22:05 +1000)
regexec.c
t/re/pat_rt_report.t

index 1b3e776..87a0d73 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -6705,7 +6705,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
            scan = loceol;
        break;
     case CANY:  /* Move <scan> forward <max> bytes, unless goes off end */
            scan = loceol;
        break;
     case CANY:  /* Move <scan> forward <max> bytes, unless goes off end */
-        if (utf8_target && scan + max < loceol) {
+        if (utf8_target && loceol - scan > max) {
 
             /* <loceol> hadn't been adjusted in the UTF-8 case */
             scan +=  max;
 
             /* <loceol> hadn't been adjusted in the UTF-8 case */
             scan +=  max;
index 005f880..9f057e6 100644 (file)
@@ -22,7 +22,7 @@ BEGIN {
 }
 
 
 }
 
 
-plan tests => 2531;  # Update this when adding/deleting tests.
+plan tests => 2532;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
 
 run_tests() unless caller;
 
@@ -1167,6 +1167,10 @@ EOP
        # in the report above that only happened in a thread.
        my $s = "\x{1ff}" . "f" x 32;
        ok($s =~ /\x{1ff}[[:alpha:]]+/gca, "POSIXA pointer wrap");
        # in the report above that only happened in a thread.
        my $s = "\x{1ff}" . "f" x 32;
        ok($s =~ /\x{1ff}[[:alpha:]]+/gca, "POSIXA pointer wrap");
+
+       # this one segfaulted under the conditions above
+       # of course, CANY is evil, maybe it should crash
+       ok($s =~ /.\C+/, "CANY pointer wrap");
     }
 } # End of sub run_tests
 
     }
 } # End of sub run_tests