ptx: avoid infloop due to zero-length matches with -S regex

* src/ptx.c (find_occurs_in_text): Die with an appropriate error
diagnostic when the given regular expression returns a match of
length 0.
* tests/misc/ptx.pl (S-infloop): Add a test.
* NEWS (Bug fixes): Mention the fix.

Fixes https://bugs.gnu.org/28417 which was detected using
Symbolic Execution techniques developed in the course of the
SYMBIOSYS research project at COMSYS, RWTH Aachen University.
This commit is contained in:
Bernhard Voelker 2017-09-13 23:37:20 +02:00
parent 5d9d07bbb1
commit 97c5045435
3 changed files with 16 additions and 0 deletions

5
NEWS
View File

@ -2,6 +2,11 @@ GNU coreutils NEWS -*- outline -*-
* Noteworthy changes in release ?.? (????-??-??) [?]
** Bug fixes
ptx -S no longer infloops for a pattern which returns zero-length matches.
[the bug dates back to the initial implementation]
* Noteworthy changes in release 8.28 (2017-09-01) [stable]

View File

@ -818,6 +818,11 @@ find_occurs_in_text (int file_index)
case -1:
break;
case 0:
die (EXIT_FAILURE, 0,
_("error: regular expression has a match of length zero: %s"),
quote (context_regex.string));
default:
next_context_start = cursor + context_regs.end[0];
break;

View File

@ -40,6 +40,12 @@ my @Tests =
{OUT=>".xx \"\" \"\" \"foo\" \"\"\n"}],
["format-t", '--format=tex', {IN=>"foo\n"},
{OUT=>"\\xx {}{}{foo}{}{}\n"}],
# with coreutils-8.28 and earlier, the -S option would infloop with
# matches of zero-length.
["S-infloop", '-S ^', {IN=>"a\n"}, {EXIT=>1},
{ERR_SUBST=>'s/^.*reg.*ex.*length zero.*$/regexlzero/'},
{ERR=>"regexlzero\n"}],
);
@Tests = triple_test \@Tests;