From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Jonathan Niedier" <jrnieder@gmail.com>,
vnwildman@gmail.com, schwab@linux-m68k.org,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v2] gettext.c: only work around the vsnprintf bug on glibc < 2.17
Date: Sat, 30 Nov 2013 19:01:24 +0700 [thread overview]
Message-ID: <1385812884-23776-1-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1385776291-21006-1-git-send-email-pclouds@gmail.com>
Bug 6530 [1] causes "git show v0.99.6~1" to fail with error "your
vsnprintf is broken". The workaround avoids that, but it corrupts
system error messages in non-C locales.
The bug has been fixed since 2.17. If git is built with glibc, it can
know running libc version with gnu_get_libc_version() and avoid the
workaround on fixed versions. The workaround is also dropped for all
non-glibc systems.
Tested on Gentoo Linux, glibc 2.17, amd64.
[1] http://sourceware.org/bugzilla/show_bug.cgi?id=6530
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
v2 removes USE_GLIBC and lets git-compat-util.h do the detection
gettext.c | 24 ++++++++++++++++--------
git-compat-util.h | 11 +++++++++++
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/gettext.c b/gettext.c
index 71e9545..772ab92 100644
--- a/gettext.c
+++ b/gettext.c
@@ -30,7 +30,7 @@ int use_gettext_poison(void)
#ifndef NO_GETTEXT
static const char *charset;
-static void init_gettext_charset(const char *domain)
+static void init_gettext_charset(const char *domain, int vsnprintf_broken)
{
/*
This trick arranges for messages to be emitted in the user's
@@ -99,9 +99,7 @@ static void init_gettext_charset(const char *domain)
$ LANGUAGE= LANG=de_DE.utf8 ./test
test: Kein passendes Ger?t gefunden
- In the long term we should probably see about getting that
- vsnprintf bug in glibc fixed, and audit our code so it won't
- fall apart under a non-C locale.
+ The vsnprintf bug has been fixed since 2.17.
Then we could simply set LC_CTYPE from the environment, which would
make things like the external perror(3) messages work.
@@ -112,21 +110,31 @@ static void init_gettext_charset(const char *domain)
1. http://sourceware.org/bugzilla/show_bug.cgi?id=6530
2. E.g. "Content-Type: text/plain; charset=UTF-8\n" in po/is.po
*/
- setlocale(LC_CTYPE, "");
+ if (vsnprintf_broken)
+ setlocale(LC_CTYPE, "");
charset = locale_charset();
bind_textdomain_codeset(domain, charset);
- setlocale(LC_CTYPE, "C");
+ if (vsnprintf_broken)
+ setlocale(LC_CTYPE, "C");
}
void git_setup_gettext(void)
{
const char *podir = getenv("GIT_TEXTDOMAINDIR");
+ const char *version = glibc_version();
+ int major, minor, vsnprintf_broken;
+
+ if (version && sscanf(version, "%d.%d", &major, &minor) == 2 &&
+ (major > 2 || (major == 2 && minor >= 17)))
+ vsnprintf_broken = 0;
+ else
+ vsnprintf_broken = 1;
if (!podir)
podir = GIT_LOCALE_PATH;
bindtextdomain("git", podir);
- setlocale(LC_MESSAGES, "");
- init_gettext_charset("git");
+ setlocale(vsnprintf_broken ? LC_MESSAGES : LC_ALL, "");
+ init_gettext_charset("git", vsnprintf_broken);
textdomain("git");
}
diff --git a/git-compat-util.h b/git-compat-util.h
index 7776f12..967f452 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -488,11 +488,22 @@ extern int git_vsnprintf(char *str, size_t maxsize,
#ifdef __GLIBC_PREREQ
#if __GLIBC_PREREQ(2, 1)
+#include <gnu/libc-version.h>
+#define glibc_version() gnu_get_libc_version()
#define HAVE_STRCHRNUL
#define HAVE_MEMPCPY
#endif
#endif
+#ifndef glibc_version
+#ifdef __GNU_LIBRARY__
+#define glibc_version() NULL
+#else
+/* non-glibc platforms, see git_setup_gettext() for "2.17" */
+#define glibc_version() "2.17"
+#endif
+#endif
+
#ifndef HAVE_STRCHRNUL
#define strchrnul gitstrchrnul
static inline char *gitstrchrnul(const char *s, int c)
--
1.8.2.83.gc99314b
next prev parent reply other threads:[~2013-11-30 11:57 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-30 1:51 [PATCH] gettext.c: only work around the vsnprintf bug on glibc < 2.17 Nguyễn Thái Ngọc Duy
2013-11-30 9:51 ` Andreas Schwab
2013-11-30 12:01 ` Nguyễn Thái Ngọc Duy [this message]
2013-11-30 23:01 ` [PATCH v2] " Torsten Bögershausen
2013-11-30 23:06 ` Torsten Bögershausen
2013-12-01 1:33 ` Duy Nguyen
2013-12-01 2:45 ` [PATCH v3] gettext.c: detect the vsnprintf bug at runtime Nguyễn Thái Ngọc Duy
2013-12-02 0:31 ` Trần Ngọc Quân
2013-12-02 5:57 ` Duy Nguyen
2013-12-02 7:40 ` Trần Ngọc Quân
2013-12-02 8:49 ` Trần Ngọc Quân
2013-12-02 9:00 ` Duy Nguyen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385812884-23776-1-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
--cc=schwab@linux-m68k.org \
--cc=vnwildman@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.