diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/findlocale.c | 19 | ||||
-rw-r--r-- | locale/loadlocale.c | 2 |
2 files changed, 17 insertions, 4 deletions
diff --git a/locale/findlocale.c b/locale/findlocale.c index 8d6e4e33e3..43ff7201c1 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -244,7 +244,14 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, locale_file = locale_file->successor[cnt]; if (locale_file == NULL) - return NULL; + { + /* If this is the second time we tried to load a failed + locale then the locale_file value comes from the cache + and we will not carry out any actual filesystem + operations so we must set ENOENT here. */ + __set_errno (ENOENT); + return NULL; + } } /* The LC_CTYPE category allows to check whether a locale is really @@ -291,8 +298,14 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, if (__gconv_compare_alias (upstr (ccodeset, ccodeset), upstr (clocale_codeset, clocale_codeset)) != 0) - /* The codesets are not identical, don't use the locale. */ - return NULL; + { + /* The codesets are not identical, don't use the locale. + If this is the second time we tried to load a locale + whose codeset doesn't match then the result came from + the cache and must set ENOENT here. */ + __set_errno (ENOENT); + return NULL; + } } /* Determine the locale name for which loading succeeded. This diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 1e5f93e927..991c0591e9 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -237,7 +237,6 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) int save_err; int alloc = ld_mapped; - file->decided = 1; file->data = NULL; fd = __open_nocancel (file->filename, O_RDONLY | O_CLOEXEC); @@ -345,6 +344,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) newdata->alloc = alloc; file->data = newdata; + file->decided = 1; } void |