Some fixes in translation support.

[INTERPRETER]
* BUG: Fix possible buffer overflow on localisation environment variables.
* BUG: Always define LC_ALL and LANG with the effective language chosen.
* BUG: Use the current language to load translations, not what setlocale() returns.
This commit is contained in:
gambas 2020-09-11 00:39:00 +02:00
parent 687708e1b3
commit ed0f467b63

View file

@ -108,9 +108,9 @@ static bool _translation_loaded = FALSE;
static LOCAL_INFO *local_current;
static char env_LC_ALL[MAX_LANG + sizeof "LC_ALL" + 1];
static char env_LANGUAGE[MAX_LANG + sizeof "LANGUAGE" + 1];
static char env_LANG[MAX_LANG + sizeof "LANG" + 1];
static char env_LC_ALL[MAX_LANG + sizeof "LC_ALL" + 2];
static char env_LANGUAGE[MAX_LANG + sizeof "LANGUAGE" + 2];
static char env_LANG[MAX_LANG + sizeof "LANG" + 2];
static bool _currency;
@ -152,7 +152,7 @@ static bool is_currency_space(bool negative, bool intl)
static void my_setenv(const char *name, const char *value, char *ptr)
{
snprintf(ptr, MAX_LANG + strlen(name) + 1, "%s=%s", name, value);
snprintf(ptr, MAX_LANG + strlen(name) + 2, "%s=%s", name, value);
putenv(ptr);
}
@ -590,7 +590,7 @@ const char *LOCAL_get_lang(void)
if (!_lang)
{
lang = getenv("LC_ALL");
if (!lang)
if (!lang || !*lang)
lang = getenv("LANG");
if (!lang || !*lang)
lang = "en_US";
@ -622,6 +622,9 @@ void LOCAL_set_lang(const char *lang)
STRING_free(&_lang);
lang = LOCAL_get_lang();
my_setenv("LANG", lang, env_LANG);
my_setenv("LC_ALL", lang, env_LC_ALL);
if (getenv("LANGUAGE"))
my_setenv("LANGUAGE", lang, env_LANGUAGE);
@ -1635,7 +1638,7 @@ static void LOCAL_load_translation(ARCHIVE *arch)
dir = FILE_cat(FILE_make_temp(NULL, NULL), "tr", NULL);
mkdir(dir, S_IRWXU);
dir = FILE_cat(FILE_make_temp(NULL, NULL), "tr", setlocale(LC_ALL, NULL), NULL);
dir = FILE_cat(FILE_make_temp(NULL, NULL), "tr", LOCAL_get_lang(), NULL);
mkdir(dir, S_IRWXU);
dir = FILE_cat(dir, "LC_MESSAGES", NULL);