{"thread":{"id":"24723","subject":"[PATCH] gettext: setlocale(LC_CTYPE, \"\") breaks Git's C function assumptions","startedAt":"2010-08-12T22:08:15Z","lastAt":"2010-08-13T09:39:49Z","messageCount":2,"participants":["Ævar Arnfjörð Bjarmason","Jakub Narebski"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"147955","messageId":"1281650895-7449-1-git-send-email-avarab@gmail.com","threadId":"24723","inReplyTo":null,"subject":"[PATCH] gettext: setlocale(LC_CTYPE, \"\") breaks Git's C function assumptions","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2010-08-12T22:08:15Z","receivedAt":"2010-08-12T22:08:15Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Remove the setlocale/LC_CTYPE call from gettext.c, we only need\nsetlocale/LC_MESSAGES to use the message catalog, and setting LC_CTYPE\nfrom the environment breaks Git's assumptions about C library\nfunctions.\n\nUnder a non-C locale functions like vsnprintf become locale sensitive,\nso that they'll e.g. refuse to process ISO-8895-1 data under a UTF-8\nlocale.\n\nThis triggered a \"your vsnprintf is broken\" error on Git's own\nrepository when inspecting v0.99.6~1 under a UTF-8 locale.\n\nThat commit contains a ISO-8859-1 encoded author name, which the\nlocale aware vsnprintf(3) won't interpolate in the format argument,\ndue to mismatch between the data encoding and the locale.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n\nThis goes on top of the ab/i18n series in pu.\n\n gettext.c                           |    1 -\n t/t0203-gettext-setlocale-sanity.sh |   26 ++++++++++++++++++++++++++\n 2 files changed, 26 insertions(+), 1 deletions(-)\n create mode 100755 t/t0203-gettext-setlocale-sanity.sh\n\ndiff --git a/gettext.c b/gettext.c\nindex 7ae5cae..db99742 100644\n--- a/gettext.c\n+++ b/gettext.c\n@@ -17,6 +17,5 @@ extern void git_setup_gettext(void) {\n \t}\n \n \t(void)setlocale(LC_MESSAGES, \"\");\n-\t(void)setlocale(LC_CTYPE, \"\");\n \t(void)textdomain(\"git\");\n }\ndiff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh\nnew file mode 100755\nindex 0000000..a212460\n--- /dev/null\n+++ b/t/t0203-gettext-setlocale-sanity.sh\n@@ -0,0 +1,26 @@\n+#!/bin/sh\n+#\n+# Copyright (c) 2010 Ævar Arnfjörð Bjarmason\n+#\n+\n+test_description=\"The Git C functions aren't broken by setlocale(3)\"\n+\n+. ./lib-gettext.sh\n+\n+test_expect_success 'git show a ISO-8859-1 commit under C locale' '\n+\t. \"$TEST_DIRECTORY\"/t3901-8859-1.txt &&\n+\ttest_commit \"iso-c-commit\" iso-under-c &&\n+\tgit show >out 2>err &&\n+\t! test -s err &&\n+\tgrep -q \"iso-c-commit\" out\n+'\n+\n+test_expect_success GETTEXT_LOCALE 'git show a ISO-8859-1 commit under a UTF-8 locale' '\n+\t. \"$TEST_DIRECTORY\"/t3901-8859-1.txt &&\n+\ttest_commit \"iso-utf8-commit\" iso-under-utf8 &&\n+\tLANGUAGE=is LC_ALL=\"$is_IS_locale\" git show >out 2>err &&\n+\t! test -s err &&\n+\tgrep -q \"iso-utf8-commit\" out\n+'\n+\n+test_done\n-- \n1.7.2.1.327.gfb40\n"},{"id":"147995","messageId":"m3pqxm3l7k.fsf@localhost.localdomain","threadId":"24723","inReplyTo":"1281650895-7449-1-git-send-email-avarab@gmail.com","subject":"Re: [PATCH] gettext: setlocale(LC_CTYPE, \"\") breaks Git's C function assumptions","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2010-08-13T09:39:49Z","receivedAt":"2010-08-13T09:39:49Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:\n\n> Remove the setlocale/LC_CTYPE call from gettext.c, we only need\n> setlocale/LC_MESSAGES to use the message catalog, and setting LC_CTYPE\n> from the environment breaks Git's assumptions about C library\n> functions.\n> \n> Under a non-C locale functions like vsnprintf become locale sensitive,\n> so that they'll e.g. refuse to process ISO-8895-1 data under a UTF-8\n> locale.\n> \n> This triggered a \"your vsnprintf is broken\" error on Git's own\n> repository when inspecting v0.99.6~1 under a UTF-8 locale.\n> \n> That commit contains a ISO-8859-1 encoded author name, which the\n> locale aware vsnprintf(3) won't interpolate in the format argument,\n> due to mismatch between the data encoding and the locale.\n\nSidenote: This commit was done probably before invention of 'encoding'\nheader, but it should be displayable anyway.\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"}]}