Merge branch 'nd/gettext-vsnprintf'

* nd/gettext-vsnprintf:
  gettext.c: detect the vsnprintf bug at runtime
This commit is contained in:
Junio C Hamano
2013-12-17 11:47:10 -08:00

View File

@ -29,6 +29,17 @@ int use_gettext_poison(void)
#endif #endif
#ifndef NO_GETTEXT #ifndef NO_GETTEXT
static int test_vsnprintf(const char *fmt, ...)
{
char buf[26];
int ret;
va_list ap;
va_start(ap, fmt);
ret = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
return ret;
}
static const char *charset; static const char *charset;
static void init_gettext_charset(const char *domain) static void init_gettext_charset(const char *domain)
{ {
@ -99,9 +110,7 @@ static void init_gettext_charset(const char *domain)
$ LANGUAGE= LANG=de_DE.utf8 ./test $ LANGUAGE= LANG=de_DE.utf8 ./test
test: Kein passendes Ger?t gefunden test: Kein passendes Ger?t gefunden
In the long term we should probably see about getting that The vsnprintf bug has been fixed since glibc 2.17.
vsnprintf bug in glibc fixed, and audit our code so it won't
fall apart under a non-C locale.
Then we could simply set LC_CTYPE from the environment, which would Then we could simply set LC_CTYPE from the environment, which would
make things like the external perror(3) messages work. make things like the external perror(3) messages work.
@ -115,7 +124,9 @@ static void init_gettext_charset(const char *domain)
setlocale(LC_CTYPE, ""); setlocale(LC_CTYPE, "");
charset = locale_charset(); charset = locale_charset();
bind_textdomain_codeset(domain, charset); bind_textdomain_codeset(domain, charset);
setlocale(LC_CTYPE, "C"); /* the string is taken from v0.99.6~1 */
if (test_vsnprintf("%.*s", 13, "David_K\345gedal") < 0)
setlocale(LC_CTYPE, "C");
} }
void git_setup_gettext(void) void git_setup_gettext(void)