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

[PATCH] cherry-pick: do not dump core when iconv fails

From
Jonathan Nieder <jrnieder@gmail.com>
Date
May 8, 2010, 23:17 UTC
Message-ID
<20100508231729.GA6718@progeny.tock>
In-Reply-To
<20100430133228.GA1620@progeny.tock>

When cherry-picking, usually the new and old commit encodings are both UTF-8. Most old iconv implementations do not support this trivial conversion, so on old platforms, out->message remains NULL, and later attempts to read it segfault.

Fix this by noticing the input and output encodings match and skipping the iconv step, like the other reencode_string() call sites already do. Also stop segfaulting on other iconv failures: if iconv fails for some other reason, the best we can do is to pass the old message through.

This fixes a regression introduced in v1.7.1-rc0~15^2~2 (revert: clarify label on conflict hunks, 2010-03-20).

Reported-by: Andreas Krey <a.krey@gmx.de>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Andreas reported this cherry-pick regression about a week ago, and a
patch similar to this one seemed to fix it.  The only question that
made me stall was what to do if iconv just doesn’t understand an
encoding:
 - from a certain point of view it might make sense to pass through
   the message and note the old encoding
 - but on the other hand, that would not respect the user’s preference
   as expressed in i18n.commitencoding, and it would deny the caller
   the chance to fix the encoding problem in a text editor before
   commiting.

That second point was driven home when I tried to implement this: it required teaching ‘git commit’ to respect a new GIT_COMMIT_ENCODING variable, but this was a pain (there is a sizeable amount of code paying attention to i18n.commitencoding) and the result would have been cherry-pick ignoring the $GIT_COMMIT_ENCODING preference, creating encoding mismatches between ident and commit message to boot.

Everyone should be using utf8 anyway. :)

Anyway, this minimal fix should be safe (it just restores the old behavior, except we do not use iconv for trivial conversions any more). Patch is against v1.7.1-rc0~15^2~2.

Thanks to Andreas for the help.
 builtin/revert.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 5a5b721..5adaf27 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -97,8 +97,13 @@ static int get_message(const char *raw_message, struct commit_message *out)
 		encoding = "UTF-8";
 	if (!git_commit_encoding)
 		git_commit_encoding = "UTF-8";
-	if ((out->reencoded_message = reencode_string(raw_message,
-					git_commit_encoding, encoding)))
+
+	out->reencoded_message = NULL;
+	out->message = raw_message;
+	if (strcmp(encoding, git_commit_encoding))
+		out->reencoded_message = reencode_string(raw_message,
+					git_commit_encoding, encoding);
+	if (out->reencoded_message)
 		out->message = out->reencoded_message;
 
 	abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
-- 
1.7.1
Previous: Jonathan NiederNext: Junio C Hamano
Message 11 of 14 in “Proper way to abort incorrect cherry-picking?”
  1. Eugene SajineApr 28, 2010
  2. David BorowitzApr 28, 2010
  3. Eugene SajineApr 28, 2010
  4. Jon SeymourApr 28, 2010
  5. Jonathan NiederApr 28, 2010
  6. Jon SeymourApr 29, 2010
  7. git cherry(pick) dumps coreAndreas Krey, Apr 29, 2010
  8. Jonathan NiederApr 29, 2010
  9. Andreas KreyApr 29, 2010
  10. Jonathan NiederApr 30, 2010
  11. cherry-pick: do not dump core when iconv failsJonathan Nieder, May 8, 2010
  12. Junio C HamanoMay 8, 2010
  13. Jonathan NiederApr 28, 2010
  14. Eugene SajineApr 28, 2010

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.