summaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2004-03-31 11:42:40 +0000
committerEric Andersen <andersen@codepoet.org>2004-03-31 11:42:40 +0000
commit46390ed829dd770e4dea4630b9ce80bbe4659737 (patch)
treee9c4567935ded129f243e937e414fe9a490c774a /editors
parentc11a6a887b82e4c1f51e18499b06c0d745771ab0 (diff)
downloadbusybox-w32-46390ed829dd770e4dea4630b9ce80bbe4659737.tar.gz
busybox-w32-46390ed829dd770e4dea4630b9ce80bbe4659737.tar.bz2
busybox-w32-46390ed829dd770e4dea4630b9ce80bbe4659737.zip
Junio Hamano, junio at twinsun dot com writes:
The sed command in busybox 1.0.0-pre8 loses leading whitespace in 'a' command ('i' and 'c' commands are also affected). A patch to fix this is attached at the end of this message. The following is a transcript that reproduces the problem. The first run uses busybox 1.0.0-pre3 as "/bin/sed" command, which gets the expected result. Later in the test, /bin/sed symlink is changed to point at busybox 1.0.0-pre8 and the test script is run again, which shows the failure. === reproduction recipe === * Part 1. Use busybox 1.0.0-pre3 as sed; this works. root# cd /tmp root# cat 1.sh #!/bin/sh cd /tmp rm -f ipsec.conf ipsec.conf+ cat >ipsec.conf <<\EOF version 2.0 config setup klipsdebug=none plutodebug=none plutostderrlog=/dev/null conn %default keyingtries=1 ... EOF sed -e '/^config setup/a\ nat_traversal=yes' ipsec.conf >ipsec.conf+ mv -f ipsec.conf+ ipsec.conf root# sh -x 1.sh + cd /tmp + rm -f ipsec.conf ipsec.conf+ + cat + sed -e /^config setup/a\ nat_traversal=yes ipsec.conf + mv -f ipsec.conf+ ipsec.conf root# cat ipsec.conf version 2.0 config setup nat_traversal=yes klipsdebug=none plutodebug=none plutostderrlog=/dev/null conn %default keyingtries=1 ... root# sed --version sed: invalid option -- - BusyBox v1.00-pre3 (2004.02.26-18:47+0000) multi-call binary Usage: sed [-nef] pattern [files...] * Part 2. Continuing from the above, use busybox 1.0.0-pre8 as sed; this fails. root# ln -s busybox-pre8 /bin/sed-8 root# mv /bin/sed-8 /bin/sed root# sed --version This is not GNU sed version 4.0 root# sed -- BusyBox v1.00-pre8 (2004.03.30-02:44+0000) multi-call binary Usage: sed [-nef] pattern [files...] root# sh -x 1.sh + cd /tmp + rm -f ipsec.conf ipsec.conf+ + cat + sed -e /^config setup/a\ nat_traversal=yes ipsec.conf + mv -f ipsec.conf+ ipsec.conf root# cat ipsec.conf version 2.0 config setup nat_traversal=yes klipsdebug=none plutodebug=none plutostderrlog=/dev/null conn %default keyingtries=1 ... root# === reproduction recipe ends here === This problem was introduced in 1.0.0-pre4. The problem is that the command argument parsing code strips leading whitespaces too aggressively. When running the above example, the piece of code in question gets "\n\tnat_traversal=yes" as its argument in cmdstr variable (shown part in the following patch). What it needs to do at this point is to strip the first newline and nothing else, but it instead strips all the leading whitespaces at the beginning of the string, thus losing the tab character. The following patch fixes this.
Diffstat (limited to 'editors')
-rw-r--r--editors/sed.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/editors/sed.c b/editors/sed.c
index c97092a5c..ea99dd856 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -410,7 +410,9 @@ static char *parse_cmd_args(sed_cmd_t *sed_cmd, char *cmdstr)
410 if ((sed_cmd->end_line || sed_cmd->end_match) && sed_cmd->cmd != 'c') 410 if ((sed_cmd->end_line || sed_cmd->end_match) && sed_cmd->cmd != 'c')
411 bb_error_msg_and_die 411 bb_error_msg_and_die
412 ("only a beginning address can be specified for edit commands"); 412 ("only a beginning address can be specified for edit commands");
413 while(isspace(*cmdstr)) cmdstr++; 413 if (*cmdstr != '\n') /* should not happen */
414 bb_error_msg_and_die("A/I/C backslash not followed by NL?");
415 cmdstr++; /* skip over the NL following the backslash */
414 sed_cmd->string = bb_xstrdup(cmdstr); 416 sed_cmd->string = bb_xstrdup(cmdstr);
415 parse_escapes(sed_cmd->string,sed_cmd->string,strlen(cmdstr),0,0); 417 parse_escapes(sed_cmd->string,sed_cmd->string,strlen(cmdstr),0,0);
416 cmdstr += strlen(cmdstr); 418 cmdstr += strlen(cmdstr);