diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2023-03-14 21:32:42 +0100 |
---|---|---|
committer | Johannes Schindelin <johannes.schindelin@gmx.de> | 2023-04-17 21:15:42 +0200 |
commit | 4fe5d0b10afdc9ac5b703605b8d84d1ce5d71e87 (patch) | |
tree | 2ceba17720cfc0762eb042ada63bba82fa4072f5 | |
parent | 18e2b1cfc80990719275d7b08e6e50f3e8cbc902 (diff) | |
parent | c4137be0f5a6edf9a9044e6e43ecf4468c7a4046 (diff) | |
download | git-4fe5d0b10afdc9ac5b703605b8d84d1ce5d71e87.tar.gz |
Merge branch 'avoid-using-uninitialized-gettext'
Avoids the overhead of calling `gettext` when initialization of the
translated messages was skipped. Addresses CVE-2023-25815.
* avoid-using-uninitialized-gettext: (1 commit)
gettext: avoid using gettext if the locale dir is not present
-rw-r--r-- | gettext.c | 4 | ||||
-rw-r--r-- | gettext.h | 7 |
2 files changed, 10 insertions, 1 deletions
@@ -109,6 +109,8 @@ static void init_gettext_charset(const char *domain) setlocale(LC_CTYPE, "C"); } +int git_gettext_enabled = 0; + void git_setup_gettext(void) { const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT); @@ -130,6 +132,8 @@ void git_setup_gettext(void) init_gettext_charset("git"); textdomain("git"); + git_gettext_enabled = 1; + free(p); } @@ -31,9 +31,11 @@ int use_gettext_poison(void); #ifndef NO_GETTEXT +extern int git_gettext_enabled; void git_setup_gettext(void); int gettext_width(const char *s); #else +#define git_gettext_enabled (0) static inline void git_setup_gettext(void) { use_gettext_poison(); /* getenv() reentrancy paranoia */ @@ -48,7 +50,8 @@ static inline FORMAT_PRESERVING(1) const char *_(const char *msgid) { if (!*msgid) return ""; - return use_gettext_poison() ? "# GETTEXT POISON #" : gettext(msgid); + return use_gettext_poison() ? "# GETTEXT POISON #" : + !git_gettext_enabled ? msgid : gettext(msgid); } static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2) @@ -56,6 +59,8 @@ const char *Q_(const char *msgid, const char *plu, unsigned long n) { if (use_gettext_poison()) return "# GETTEXT POISON #"; + if (!git_gettext_enabled) + return n == 1 ? msgid : plu; return ngettext(msgid, plu, n); } |