From 382b64b01c68263fca65d9280d14e4468cacc280 Mon Sep 17 00:00:00 2001 From: "Philip.Hazel" Date: Sat, 6 May 2017 16:56:07 +0000 Subject: [PATCH] Fix crash when more than one kind of "push" was set in pcre2test. --- ChangeLog | 3 +++ src/pcre2test.c | 15 ++++++++------ testdata/testinput20 | 44 +++++++++++++++++++++++----------------- testdata/testoutput20 | 47 ++++++++++++++++++++++++++----------------- 4 files changed, 67 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d00069..cfb7b63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -153,6 +153,9 @@ tests to improve coverage. 30. Implement (?n: for PCRE2_NO_AUTO_CAPTURE, because Perl now has this. +31. If more than one of "push", "pushcopy", or "pushtablescopy" were set in +pcre2test, a crash could occur. + Version 10.23 14-February-2017 ------------------------------ diff --git a/src/pcre2test.c b/src/pcre2test.c index a7fe7c0..cab604f 100644 --- a/src/pcre2test.c +++ b/src/pcre2test.c @@ -721,12 +721,15 @@ the first control word. Note that CTL_POSIX_NOSUB is always accompanied by CTL_POSIX, so it doesn't need its own entries. */ static uint32_t exclusive_pat_controls[] = { - CTL_POSIX | CTL_HEXPAT, - CTL_POSIX | CTL_PUSH, - CTL_POSIX | CTL_PUSHCOPY, - CTL_POSIX | CTL_PUSHTABLESCOPY, - CTL_POSIX | CTL_USE_LENGTH, - CTL_EXPAND | CTL_HEXPAT }; + CTL_POSIX | CTL_HEXPAT, + CTL_POSIX | CTL_PUSH, + CTL_POSIX | CTL_PUSHCOPY, + CTL_POSIX | CTL_PUSHTABLESCOPY, + CTL_POSIX | CTL_USE_LENGTH, + CTL_PUSH | CTL_PUSHCOPY, + CTL_PUSH | CTL_PUSHTABLESCOPY, + CTL_PUSHCOPY | CTL_PUSHTABLESCOPY, + CTL_EXPAND | CTL_HEXPAT }; /* Data controls that are mutually exclusive. At present these are all in the first control word. */ diff --git a/testdata/testinput20 b/testdata/testinput20 index c87a07e..71f39ae 100644 --- a/testdata/testinput20 +++ b/testdata/testinput20 @@ -31,20 +31,20 @@ #load testsaved2 #pop info - foofoo + foofoo barbar - + #pop mark C -\= Expect no match - D - +\= Expect no match + D + #pop - AmanaplanacanalPanama + AmanaplanacanalPanama #pop info metcalfe 33 - + # Check for an error when different tables are used. /abc/push,tables=1 @@ -59,30 +59,30 @@ #pop should give an error pqr - + /abcd/pushcopy abcd - + #pop - abcd + abcd #pop should give an error /abcd/push #popcopy abcd - + #pop - abcd - + abcd + /abcd/push #save testsaved1 #pop should give an error #load testsaved1 -#popcopy +#popcopy abcd - + #pop abcd @@ -91,10 +91,18 @@ /abcd/pushtablescopy abcd -#popcopy +#popcopy abcd - + #pop - abcd + abcd + +# Must only specify one of these + +//push,pushcopy + +//push,pushtablescopy + +//pushcopy,pushtablescopy # End of testinput20 diff --git a/testdata/testoutput20 b/testdata/testoutput20 index db99866..d6265fd 100644 --- a/testdata/testoutput20 +++ b/testdata/testoutput20 @@ -40,25 +40,25 @@ Named capturing subpatterns: Options: dupnames Starting code units: b f Subject length lower bound = 6 - foofoo + foofoo 0: foofoo 1: foo barbar 0: barbar 1: 2: bar - + #pop mark C 0: C 1: C MK: A -\= Expect no match - D +\= Expect no match + D No match, mark = A - + #pop - AmanaplanacanalPanama + AmanaplanacanalPanama 0: AmanaplanacanalPanama 1: 2: @@ -78,7 +78,7 @@ Subject length lower bound = 3 0: metcalfe 33 1: metcalfe 2: 33 - + # Check for an error when different tables are used. /abc/push,tables=1 @@ -97,13 +97,13 @@ Serialization failed: error -30: patterns do not all use the same character tabl #pop should give an error ** Can't pop off an empty stack pqr - + /abcd/pushcopy abcd 0: abcd - + #pop - abcd + abcd 0: abcd #pop should give an error @@ -113,21 +113,21 @@ Serialization failed: error -30: patterns do not all use the same character tabl #popcopy abcd 0: abcd - + #pop - abcd + abcd 0: abcd - + /abcd/push #save testsaved1 #pop should give an error ** Can't pop off an empty stack #load testsaved1 -#popcopy +#popcopy abcd 0: abcd - + #pop abcd 0: abcd @@ -139,12 +139,23 @@ Serialization failed: error -30: patterns do not all use the same character tabl abcd 0: abcd -#popcopy +#popcopy abcd 0: abcd - + #pop - abcd + abcd 0: abcd +# Must only specify one of these + +//push,pushcopy +** Not allowed together: push pushcopy + +//push,pushtablescopy +** Not allowed together: push pushtablescopy + +//pushcopy,pushtablescopy +** Not allowed together: pushcopy pushtablescopy + # End of testinput20