From 44405738a05267a479f01f3b29a0a3b33cb15053 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=86var=20Arnfj=C3=B6r=C3=B0=20Bjarmason?= Date: Thu, 12 Aug 2010 22:08:15 +0000 Subject: [PATCH] gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Remove the setlocale/LC_CTYPE call from gettext.c, we only need setlocale/LC_MESSAGES to use the message catalog, and setting LC_CTYPE from the environment breaks Git's assumptions about C library functions. Under a non-C locale functions like vsnprintf become locale sensitive, so that they'll e.g. refuse to process ISO-8895-1 data under a UTF-8 locale. This triggered a "your vsnprintf is broken" error on Git's own repository when inspecting v0.99.6~1 under a UTF-8 locale. That commit contains a ISO-8859-1 encoded author name, which the locale aware vsnprintf(3) won't interpolate in the format argument, due to mismatch between the data encoding and the locale. Signed-off-by: Ævar Arnfjörð Bjarmason Signed-off-by: Junio C Hamano --- gettext.c | 1 - t/t0203-gettext-setlocale-sanity.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100755 t/t0203-gettext-setlocale-sanity.sh diff --git a/gettext.c b/gettext.c index 7ae5caed4..db99742bc 100644 --- a/gettext.c +++ b/gettext.c @@ -17,6 +17,5 @@ extern void git_setup_gettext(void) { } (void)setlocale(LC_MESSAGES, ""); - (void)setlocale(LC_CTYPE, ""); (void)textdomain("git"); } diff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh new file mode 100755 index 000000000..a21246008 --- /dev/null +++ b/t/t0203-gettext-setlocale-sanity.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Copyright (c) 2010 Ævar Arnfjörð Bjarmason +# + +test_description="The Git C functions aren't broken by setlocale(3)" + +. ./lib-gettext.sh + +test_expect_success 'git show a ISO-8859-1 commit under C locale' ' + . "$TEST_DIRECTORY"/t3901-8859-1.txt && + test_commit "iso-c-commit" iso-under-c && + git show >out 2>err && + ! test -s err && + grep -q "iso-c-commit" out +' + +test_expect_success GETTEXT_LOCALE 'git show a ISO-8859-1 commit under a UTF-8 locale' ' + . "$TEST_DIRECTORY"/t3901-8859-1.txt && + test_commit "iso-utf8-commit" iso-under-utf8 && + LANGUAGE=is LC_ALL="$is_IS_locale" git show >out 2>err && + ! test -s err && + grep -q "iso-utf8-commit" out +' + +test_done -- 2.30.2