rebase -i: do not "echo" random user-supplied strings
authorUwe Storbeck <uwe@ibr.ch>
Fri, 14 Mar 2014 23:56:43 +0000 (00:56 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 17 Mar 2014 19:24:14 +0000 (12:24 -0700)
In some places we "echo" a string that comes from a commit log
message, which may have a backslash sequence that is interpreted by
the command (POSIX.1 allows this), most notably "dash"'s built-in
'echo'.

A commit message which contains the string '\n' (or ends with the
string '\c') may result in a garbage line in the todo list of an
interactive rebase which causes the rebase to fail.

To reproduce the behavior (with dash as /bin/sh):

mkdir test && cd test && git init
echo 1 >foo && git add foo
git commit -m"this commit message ends with '\n'"
echo 2 >foo && git commit -a --fixup HEAD
git rebase -i --autosquash --root

Now the editor opens with garbage in line 3 which has to be
removed or the rebase fails.

Signed-off-by: Uwe Storbeck <uwe@ibr.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase--interactive.sh
index 43c19e0829ca727501ba7e4d29c952bc286ccb77..43631b472311d0feb13f4d62c6355baeedbdb040 100644 (file)
@@ -739,7 +739,7 @@ rearrange_squash () {
                                        ;;
                                esac
                        done
-                       echo "$sha1 $action $prefix $rest"
+                       printf '%s %s %s %s\n' "$sha1" "$action" "$prefix" "$rest"
                        # if it's a single word, try to resolve to a full sha1 and
                        # emit a second copy. This allows us to match on both message
                        # and on sha1 prefix