[git commit] sed: yet another fix on top of zero length match code

Denys Vlasenko vda.linux at googlemail.com
Fri Jun 8 08:25:31 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=37ca36a71114a6fc5303d33cabc311cd8b9bf19a
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/sed.c       |   15 ++++++++++-----
 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


More information about the busybox-cvs mailing list