about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2014-11-17 22:00:58 -0200
committerAlexandre Oliva <aoliva@redhat.com>2015-02-26 02:16:51 -0300
commit0d822a016b631aef409df5805f58962fe5bbcdc5 (patch)
treefa1265412059d2b5f06ed1de2f5637e346a90866
parentca681b7b7b79bea3af62fe709df6594f3f5457e6 (diff)
downloadglibc-0d822a016b631aef409df5805f58962fe5bbcdc5.tar.gz
glibc-0d822a016b631aef409df5805f58962fe5bbcdc5.tar.xz
glibc-0d822a016b631aef409df5805f58962fe5bbcdc5.zip
BZ #15969: search locale archive again after alias expansion
If a locale alias is defined in locale.alias but not in an archive,
and the referenced locale is only present in the archive, setlocale
will fail if given the alias name.  This is unintuitive.  This patch
fixes it, arranging for the locale archive to be searched again after
alias expansion.

for  ChangeLog

	[BZ #15969]
	* locale/findlocale.c (_nl_find_locale): Retry archive search
	after alias expansion.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS8
-rw-r--r--locale/findlocale.c19
3 files changed, 25 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index dd590b06ea..0d7cf377ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-26  Alexandre Oliva <aoliva@redhat.com>
+
+	[BZ #15969]
+	* locale/findlocale.c (_nl_find_locale): Retry archive search
+	after alias expansion.
+
 2015-02-25  Roland McGrath  <roland@hack.frob.com>
 
 	* iconv/tst-iconv3.c (main): Converted to ...
diff --git a/NEWS b/NEWS
index 72c685f756..db6c5f122c 100644
--- a/NEWS
+++ b/NEWS
@@ -9,10 +9,10 @@ Version 2.22
 
 * The following bugs are resolved with this release:
 
-  4719, 14841, 13064, 14094, 15319, 15467, 15790, 16560, 16783, 17269,
-  17523, 17569, 17588, 17792, 17836, 17912, 17916, 17932, 17944, 17949,
-  17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999,
-  18019, 18020.
+  4719, 14841, 13064, 14094, 15319, 15467, 15790, 15969, 16560, 16783,
+  17269, 17523, 17569, 17588, 17792, 17836, 17912, 17916, 17932, 17944,
+  17949, 17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998,
+  17999, 18019, 18020.
 
 * Character encoding and ctype tables were updated to Unicode 7.0.0, using
   new generator scripts contributed by Pravin Satpute and Mike FABIAN (Red
diff --git a/locale/findlocale.c b/locale/findlocale.c
index ab879d7775..360f58b904 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -156,15 +156,26 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
       if (__glibc_likely (data != NULL))
 	return data;
 
+      /* Nothing in the archive with the given name.  Expanding it as
+	 an alias and retry.  */
+      loc_name = (char *) _nl_expand_alias (*name);
+      if (loc_name != NULL)
+	{
+	  data = _nl_load_locale_from_archive (category, &loc_name);
+	  if (__builtin_expect (data != NULL, 1))
+	    return data;
+	}
+
       /* Nothing in the archive.  Set the default path to search below.  */
       locale_path = _nl_default_locale_path;
       locale_path_len = sizeof _nl_default_locale_path;
     }
+  else
+    /* We really have to load some data.  First see whether the name is
+       an alias.  Please note that this makes it impossible to have "C"
+       or "POSIX" as aliases.  */
+    loc_name = (char *) _nl_expand_alias (*name);
 
-  /* We really have to load some data.  First see whether the name is
-     an alias.  Please note that this makes it impossible to have "C"
-     or "POSIX" as aliases.  */
-  loc_name = (char *) _nl_expand_alias (*name);
   if (loc_name == NULL)
     /* It is no alias.  */
     loc_name = (char *) *name;