mirror of
https://github.com/git/git.git
synced 2026-03-13 02:13:24 +01:00
gettext: setlocale(LC_CTYPE, "") breaks Git's C function assumptions
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 <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
02f9c7c96e
commit
107880a701
@@ -17,6 +17,5 @@ extern void git_setup_gettext(void) {
|
||||
}
|
||||
|
||||
(void)setlocale(LC_MESSAGES, "");
|
||||
(void)setlocale(LC_CTYPE, "");
|
||||
(void)textdomain("git");
|
||||
}
|
||||
|
||||
26
t/t0203-gettext-setlocale-sanity.sh
Executable file
26
t/t0203-gettext-setlocale-sanity.sh
Executable file
@@ -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
|
||||
Reference in New Issue
Block a user