git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Corner case bug caused by shell dependent behavior

From
USUwe Storbeck <uwe@ibr.ch>
Date
Mar 14, 2014, 00:02 UTC
Message-ID
<20140314000213.GA3739@ibr.ch>
Hi

When your system shell (/bin/sh) is a dash control sequences in strings get interpreted by the echo command. A commit message which ends with the string '\n' 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.

The attached one-line patch fixes the bug. Be free to edit the commit message when it's too long.

Maybe there are more places where it would be more robust to use printf instead of echo.

Uwe
>From 53262bc8a7a3ec9d9a6b0e8ecaaea598257b87fe Mon Sep 17 00:00:00 2001
From: Uwe Storbeck <uwe@ibr.ch>
Date: Fri, 14 Mar 2014 00:28:33 +0100
Subject: [PATCH] git-rebase--interactive: replace echo by printf
to avoid shell dependent behavior.

When your system shell (/bin/sh) is a dash control sequences in strings get interpreted by the echo command. A commit message which ends with the string '\n' 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.
---
 git-rebase--interactive.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index a1adae8..3ffe14c 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -749,7 +749,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
-- 
1.9.0
Next: Jonathan Nieder
Message 1 of 5 in “Corner case bug caused by shell dependent behavior”
  1. Uwe StorbeckMar 14, 2014
  2. Jonathan NiederMar 14, 2014
  3. Uwe StorbeckMar 14, 2014
  4. Jeff KingMar 14, 2014
  5. David KastrupMar 14, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.