diff options
author | Denys Vlasenko | 2012-06-08 10:25:31 +0200 |
---|---|---|
committer | Denys Vlasenko | 2012-06-08 10:25:31 +0200 |
commit | 37ca36a71114a6fc5303d33cabc311cd8b9bf19a (patch) | |
tree | 28f9108375b2dc4050d447995f3fe497315d3d39 | |
parent | ba1d561d767a6f05da62adadc798f98118b2a3ee (diff) | |
download | busybox-37ca36a71114a6fc5303d33cabc311cd8b9bf19a.zip busybox-37ca36a71114a6fc5303d33cabc311cd8b9bf19a.tar.gz |
sed: yet another fix on top of zero length match code
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/sed.c | 15 | ||||
-rwxr-xr-x | testsuite/sed.tests | 6 |
2 files changed, 15 insertions, 6 deletions
diff --git a/editors/sed.c b/editors/sed.c index 0fe82f3..652aaf5 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -768,8 +768,11 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p) * Second match is NOT replaced! */ if (prev_match_empty || start != 0 || start != end) { + //dbg("%d %d %d", prev_match_empty, start, end); dbg("inserting replacement at %d in '%s'", start, line); do_subst_w_backrefs(line, sed_cmd->string); + /* Flag that something has changed */ + altered = 1; } else { dbg("NOT inserting replacement at %d in '%s'", start, line); } @@ -778,16 +781,18 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p) * copy verbatim one char after it before attempting more matches */ prev_match_empty = (start == end); - if (prev_match_empty && line[end]) { - pipe_putc(line[end]); - end++; + if (prev_match_empty) { + if (!line[end]) { + tried_at_eol = 1; + } else { + pipe_putc(line[end]); + end++; + } } /* Advance past the match */ dbg("line += %d", end); line += end; - /* Flag that something has changed */ - altered = 1; /* if we're not doing this globally, get out now */ if (sed_cmd->which_match != 0) diff --git a/testsuite/sed.tests b/testsuite/sed.tests index 12b36ae..468565f 100755 --- a/testsuite/sed.tests +++ b/testsuite/sed.tests @@ -302,10 +302,14 @@ testing "sed zero chars match/replace advances correctly 2" \ "sed 's [^ .]* x g'" \ "x x.x\n" "" " a.b\n" -testing "sed zero chars match/replace logic must not falsely trigger here" \ +testing "sed zero chars match/replace logic must not falsely trigger here 1" \ "sed 's/a/A/g'" \ "_AAA1AA\n" "" "_aaa1aa\n" +testing "sed zero chars match/replace logic must not falsely trigger here 2" \ + "sed 's/ *$/_/g'" \ + "qwerty_\n" "" "qwerty\n" + # testing "description" "commands" "result" "infile" "stdin" exit $FAILCOUNT |