fix [perl #112370] memEQ off-by-one in Perl_regexec_flags()
authorYves Orton <demerphq@gmail.com>
Sun, 15 Apr 2012 09:23:11 +0000 (11:23 +0200)
committerYves Orton <demerphq@gmail.com>
Sun, 15 Apr 2012 09:36:40 +0000 (11:36 +0200)
commit1a13b0759af8c958576ca1da3d406f7abdf9d241
tree0ec6be1098d7a48647736f36dde366e7aea8cf74
parent1d589e3bb1d165eda8b41fa754586bf1c5f0200e
fix [perl #112370] memEQ off-by-one in Perl_regexec_flags()

The problem was that when we had a floating non-unicode substr
we could read past the beginning of the string.

So for instance this code:

    foreach ("\x{2603}", 'a') {
        'b' =~ /(?:^|.)$_$/;
    }

When run under valgrind would show an illegal read.

If run under use re 'debug' we would see output like this:

    floating utf8 "a"$ at 0..1 (checking floating) minlen 1
    Matching REx "(?:^|.)a$" against "b"
    UTF-8 pattern...
    Can't trim the tail, match fails (should not happen)
    Match failed

Which suggests we are falling into a "should not happen" branch of the
code.

This patch fixes the logic to properly test string length issues, and
changes the debug output so it looks like this:

    floating utf8 "a"$ at 0..1 (checking floating) minlen 1
    Matching REx "(?:^|.)a$" against "b"
    UTF-8 pattern...
    String does not contain required trailing substring, cannot match.
    Match failed

Which makes more sense.
regexec.c