Fix out-of-bound read in case of unmatched regexp backreference
This commit is contained in:
parent
abd9ed8e7e
commit
7123c928a4
@ -0,0 +1,107 @@
|
|||||||
|
From a08fa6fd157fd0d61da7f20f07b939fbc302c2c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hugo van der Sanden <hv@crypt.org>
|
||||||
|
Date: Wed, 5 Oct 2016 12:56:05 +0100
|
||||||
|
Subject: [PATCH] [perl #129377] don't read past start of string for unmatched
|
||||||
|
backref
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Ported to 5.24.1:
|
||||||
|
|
||||||
|
commit 2dfc11ec3af312f4fa3eb244077c79dbb5fc2d85
|
||||||
|
Author: Hugo van der Sanden <hv@crypt.org>
|
||||||
|
Date: Wed Oct 5 12:56:05 2016 +0100
|
||||||
|
|
||||||
|
[perl #129377] don't read past start of string for unmatched backref
|
||||||
|
|
||||||
|
We can have (start, end) == (0, -1) for an unmatched backref, we must
|
||||||
|
check for that.
|
||||||
|
|
||||||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||||||
|
---
|
||||||
|
regexec.c | 10 ++++++----
|
||||||
|
t/re/pat.t | 16 +++++++++++++++-
|
||||||
|
2 files changed, 21 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/regexec.c b/regexec.c
|
||||||
|
index a5d5db4..a7bc0c3 100644
|
||||||
|
--- a/regexec.c
|
||||||
|
+++ b/regexec.c
|
||||||
|
@@ -5179,6 +5179,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
|
||||||
|
regnode *next;
|
||||||
|
U32 n = 0; /* general value; init to avoid compiler warning */
|
||||||
|
SSize_t ln = 0; /* len or last; init to avoid compiler warning */
|
||||||
|
+ SSize_t endref = 0; /* offset of end of backref when ln is start */
|
||||||
|
char *locinput = startpos;
|
||||||
|
char *pushinput; /* where to continue after a PUSH */
|
||||||
|
I32 nextchr; /* is always set to UCHARAT(locinput), or -1 at EOS */
|
||||||
|
@@ -6489,10 +6490,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
|
||||||
|
|
||||||
|
do_nref_ref_common:
|
||||||
|
ln = rex->offs[n].start;
|
||||||
|
+ endref = rex->offs[n].end;
|
||||||
|
reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */
|
||||||
|
- if (rex->lastparen < n || ln == -1)
|
||||||
|
+ if (rex->lastparen < n || ln == -1 || endref == -1)
|
||||||
|
sayNO; /* Do not match unless seen CLOSEn. */
|
||||||
|
- if (ln == rex->offs[n].end)
|
||||||
|
+ if (ln == endref)
|
||||||
|
break;
|
||||||
|
|
||||||
|
s = reginfo->strbeg + ln;
|
||||||
|
@@ -6506,7 +6508,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
|
||||||
|
* not going off the end given by reginfo->strend, and
|
||||||
|
* returns in <limit> upon success, how much of the
|
||||||
|
* current input was matched */
|
||||||
|
- if (! foldEQ_utf8_flags(s, NULL, rex->offs[n].end - ln, utf8_target,
|
||||||
|
+ if (! foldEQ_utf8_flags(s, NULL, endref - ln, utf8_target,
|
||||||
|
locinput, &limit, 0, utf8_target, utf8_fold_flags))
|
||||||
|
{
|
||||||
|
sayNO;
|
||||||
|
@@ -6521,7 +6523,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
|
||||||
|
(type == REF ||
|
||||||
|
UCHARAT(s) != fold_array[nextchr]))
|
||||||
|
sayNO;
|
||||||
|
- ln = rex->offs[n].end - ln;
|
||||||
|
+ ln = endref - ln;
|
||||||
|
if (locinput + ln > reginfo->strend)
|
||||||
|
sayNO;
|
||||||
|
if (ln > 1 && (type == REF
|
||||||
|
diff --git a/t/re/pat.t b/t/re/pat.t
|
||||||
|
index 4aa77cf..749edd0 100644
|
||||||
|
--- a/t/re/pat.t
|
||||||
|
+++ b/t/re/pat.t
|
||||||
|
@@ -23,7 +23,7 @@ BEGIN {
|
||||||
|
skip_all_without_unicode_tables();
|
||||||
|
}
|
||||||
|
|
||||||
|
-plan tests => 791; # Update this when adding/deleting tests.
|
||||||
|
+plan tests => 792; # Update this when adding/deleting tests.
|
||||||
|
|
||||||
|
run_tests() unless caller;
|
||||||
|
|
||||||
|
@@ -1765,6 +1765,20 @@ EOP
|
||||||
|
utf8::upgrade($str);
|
||||||
|
ok( $str =~ m{^(a|a\x{e4})$}, "fix [perl #129950] - utf8 case" );
|
||||||
|
}
|
||||||
|
+ {
|
||||||
|
+ # [perl #129377] backref to an unmatched capture should not cause
|
||||||
|
+ # reading before start of string.
|
||||||
|
+ SKIP: {
|
||||||
|
+ skip "no re-debug under miniperl" if is_miniperl;
|
||||||
|
+ my $prog = <<'EOP';
|
||||||
|
+use re qw(Debug EXECUTE);
|
||||||
|
+"x" =~ m{ () y | () \1 }x;
|
||||||
|
+EOP
|
||||||
|
+ fresh_perl_like($prog, qr{
|
||||||
|
+ \A (?! .* ^ \s+ - )
|
||||||
|
+ }msx, { stderr => 1 }, "Offsets in debug output are not negative");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
} # End of sub run_tests
|
||||||
|
|
||||||
|
1;
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
@ -252,6 +252,10 @@ Patch69: perl-5.24.1-perl-129125-copy-form-data-if-it-might-be-freed.patc
|
|||||||
# transliteration expression, RT#129342, in upstream after 5.25.8
|
# transliteration expression, RT#129342, in upstream after 5.25.8
|
||||||
Patch70: perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch
|
Patch70: perl-5.24.1-perl-129342-ensure-range-start-is-set-after-error-in.patch
|
||||||
|
|
||||||
|
# Fix out-of-bound read in case of unmatched regexp backreference, RT#129377,
|
||||||
|
# in upstream after 5.25.8
|
||||||
|
Patch71: perl-5.24.1-perl-129377-don-t-read-past-start-of-string-for-unma.patch
|
||||||
|
|
||||||
# Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048
|
# Link XS modules to libperl.so with EU::CBuilder on Linux, bug #960048
|
||||||
Patch200: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch
|
Patch200: perl-5.16.3-Link-XS-modules-to-libperl.so-with-EU-CBuilder-on-Li.patch
|
||||||
|
|
||||||
@ -2946,6 +2950,7 @@ Perl extension for Version Objects
|
|||||||
%patch68 -p1
|
%patch68 -p1
|
||||||
%patch69 -p1
|
%patch69 -p1
|
||||||
%patch70 -p1
|
%patch70 -p1
|
||||||
|
%patch71 -p1
|
||||||
%patch200 -p1
|
%patch200 -p1
|
||||||
%patch201 -p1
|
%patch201 -p1
|
||||||
|
|
||||||
@ -3004,6 +3009,7 @@ perl -x patchlevel.h \
|
|||||||
'Fedora Patch67: Fix a heap overflow with pack "W" (RT129149)' \
|
'Fedora Patch67: Fix a heap overflow with pack "W" (RT129149)' \
|
||||||
'Fedora Patch69: Fix a use-after-free when processing scalar variables in forms (RT#129125)' \
|
'Fedora Patch69: Fix a use-after-free when processing scalar variables in forms (RT#129125)' \
|
||||||
'Fedora Patch70: Fix a heap overflow if invalid octal or hexadecimal number is used in transliteration expression (RT#129342)' \
|
'Fedora Patch70: Fix a heap overflow if invalid octal or hexadecimal number is used in transliteration expression (RT#129342)' \
|
||||||
|
'Fedora Patch71: Fix out-of-bound read in case of unmatched regexp backreference (RT#129377)' \
|
||||||
'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux' \
|
'Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux' \
|
||||||
'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \
|
'Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux' \
|
||||||
%{nil}
|
%{nil}
|
||||||
@ -5286,6 +5292,7 @@ popd
|
|||||||
- Fix a use-after-free when processing scalar variables in forms (RT#129125)
|
- Fix a use-after-free when processing scalar variables in forms (RT#129125)
|
||||||
- Fix a heap overflow if invalid octal or hexadecimal number is used in
|
- Fix a heap overflow if invalid octal or hexadecimal number is used in
|
||||||
transliteration expression (RT#129342)
|
transliteration expression (RT#129342)
|
||||||
|
- Fix out-of-bound read in case of unmatched regexp backreference (RT#129377)
|
||||||
|
|
||||||
* Mon Jan 16 2017 Jitka Plesnikova <jplesnik@redhat.com> - 4:5.24.1-385
|
* Mon Jan 16 2017 Jitka Plesnikova <jplesnik@redhat.com> - 4:5.24.1-385
|
||||||
- 5.24.1 bump (see <http://search.cpan.org/dist/perl-5.24.1/pod/perldelta.pod>
|
- 5.24.1 bump (see <http://search.cpan.org/dist/perl-5.24.1/pod/perldelta.pod>
|
||||||
|
Loading…
Reference in New Issue
Block a user