| From 5be027b624bc866702808abadfe5f99360414086 Mon Sep 17 00:00:00 2001 |
| From: Philip Hazel <ph10@cam.ac.uk> |
| Date: Fri, 10 Feb 2017 17:47:34 +0000 |
| Subject: [PATCH] Correct fix for pcre2grep multiline with --only-matching. |
| |
| git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1678 2f5784b3-3f2a-0410-8824-cb99058d5e15 |
| --- |
| ChangeLog | 5 +++++ |
| configure.ac | 6 +++--- |
| pcregrep.c | 20 +++++++++++++++----- |
| 3 files changed, 23 insertions(+), 8 deletions(-) |
| |
| diff --git a/ChangeLog b/ChangeLog |
| index ab4e053e601e..373ee8422ef5 100644 |
| --- a/ChangeLog |
| +++ b/ChangeLog |
| @@ -10,6 +10,11 @@ Version 8.41 |
| 1. Fixed typo in CMakeLists.txt (wrong number of arguments for |
| PCRE_STATIC_RUNTIME (affects MSVC only). |
| |
| +2. Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline |
| +mode with --only-matching matched several lines, it restarted scanning at the |
| +next line instead of moving on to the end of the matched string, which can be |
| +several lines after the start. |
| + |
| |
| Version 8.40 11-January-2017 |
| ---------------------------- |
| diff --git a/pcregrep.c b/pcregrep.c |
| index fd2a67622baa..2070c057e4a0 100644 |
| --- a/pcregrep.c |
| +++ b/pcregrep.c |
| @@ -1804,11 +1804,6 @@ while (ptr < endptr) |
| if (line_buffered) fflush(stdout); |
| rc = 0; /* Had some success */ |
| |
| - /* If the current match ended past the end of the line (only possible |
| - in multiline mode), we are done with this line. */ |
| - |
| - if ((unsigned int)offsets[1] > linelength) goto END_ONE_MATCH; |
| - |
| startoffset = offsets[1]; /* Restart after the match */ |
| if (startoffset <= oldstartoffset) |
| { |
| @@ -1818,6 +1813,21 @@ while (ptr < endptr) |
| if (utf8) |
| while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++; |
| } |
| + |
| + /* If the current match ended past the end of the line (only possible |
| + in multiline mode), we must move on to the line in which it did end |
| + before searching for more matches. */ |
| + |
| + while (startoffset > (int)linelength) |
| + { |
| + matchptr = ptr += linelength + endlinelength; |
| + filepos += (int)(linelength + endlinelength); |
| + linenumber++; |
| + startoffset -= (int)(linelength + endlinelength); |
| + t = end_of_line(ptr, endptr, &endlinelength); |
| + linelength = t - ptr - endlinelength; |
| + } |
| + |
| goto ONLY_MATCHING_RESTART; |
| } |
| } |
| -- |
| 2.12.0 |
| |