Blob Blame History Raw
commit 0d822a016b631aef409df5805f58962fe5bbcdc5
Author: Alexandre Oliva <aoliva@redhat.com>
Date:   Mon Nov 17 22:00:58 2014 -0200

    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.

Index: b/locale/findlocale.c
===================================================================
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -156,15 +156,26 @@ _nl_find_locale (const char *locale_path
       if (__builtin_expect (data != NULL, 1))
 	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;