svn commit: r304862 - in stable/10: include/xlocale lib/libc/nls

Andrey A. Chernov ache at FreeBSD.org
Fri Aug 26 21:19:25 UTC 2016


Author: ache
Date: Fri Aug 26 21:19:23 2016
New Revision: 304862
URL: https://svnweb.freebsd.org/changeset/base/304862

Log:
  MFC r304703, r304755
  
  1) _locale.h
  LC_*_MASK bit shifting order was partially broken from the initial commit
  time at year 2012. Only LC_COLLATE_MASK and LC_CTYPE_MASK are in the
  right order.
  
  The order here should match XLC_* from "xlocale_private.h" which, in turn,
  match LC_* publicly visible order from <locale.h> which determines how
  locale components are stored in the structure.
  LC_*_MASK -> XLC_* translation done as "ffs(mask) - 1" in the querylocale()
  and equivalent shift loop in the newlocale(), so mapped to some wrong
  components (excluding two mentioned above).
  
  Formally the fix is ABI breakage, but old code using those masks
  never works properly in any case.
  Only newlocale() and querylocale() are affected.
  
  2) msgcat.c
  Use current locale (f.e. set by thread). It was global locale always
  previously.
  
  PR:     211743

Modified:
  stable/10/include/xlocale/_locale.h
  stable/10/lib/libc/nls/msgcat.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/include/xlocale/_locale.h
==============================================================================
--- stable/10/include/xlocale/_locale.h	Fri Aug 26 20:51:09 2016	(r304861)
+++ stable/10/include/xlocale/_locale.h	Fri Aug 26 21:19:23 2016	(r304862)
@@ -32,12 +32,13 @@
 #ifndef _XLOCALE_LOCALE_H
 #define _XLOCALE_LOCALE_H
 
+/* Bit shifting order of LC_*_MASK should match XLC_* and LC_* order. */
 #define LC_COLLATE_MASK  (1<<0)
 #define LC_CTYPE_MASK    (1<<1)
-#define LC_MESSAGES_MASK (1<<2)
-#define LC_MONETARY_MASK (1<<3)
-#define LC_NUMERIC_MASK  (1<<4)
-#define LC_TIME_MASK     (1<<5)
+#define LC_MONETARY_MASK (1<<2)
+#define LC_NUMERIC_MASK  (1<<3)
+#define LC_TIME_MASK     (1<<4)
+#define LC_MESSAGES_MASK (1<<5)
 #define LC_ALL_MASK      (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | \
 			  LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
 #define LC_GLOBAL_LOCALE ((locale_t)-1)

Modified: stable/10/lib/libc/nls/msgcat.c
==============================================================================
--- stable/10/lib/libc/nls/msgcat.c	Fri Aug 26 20:51:09 2016	(r304861)
+++ stable/10/lib/libc/nls/msgcat.c	Fri Aug 26 21:19:23 2016	(r304862)
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <locale.h>
 #include <nl_types.h>
 #include <pthread.h>
 #include <stdio.h>
@@ -56,7 +55,7 @@ __FBSDID("$FreeBSD$");
 #include <unistd.h>
 #include "un-namespace.h"
 
-#include "../locale/setlocale.h"        /* for ENCODING_LEN */
+#include "../locale/xlocale_private.h"
 
 #define _DEFAULT_NLS_PATH "/usr/share/nls/%L/%N.cat:/usr/share/nls/%N/%L:/usr/local/share/nls/%L/%N.cat:/usr/local/share/nls/%N/%L"
 
@@ -115,9 +114,10 @@ catopen(const char *name, int type)
 {
 	struct stat sbuf;
 	struct catentry *np;
-	char *base, *cptr, *cptr1, *lang, *nlspath, *pathP, *pcode;
-	char *plang, *pter, *tmpptr;
+	char *base, *cptr, *cptr1, *nlspath, *pathP, *pcode;
+	char *plang, *pter;
 	int saverr, spcleft;
+	const char *lang, *tmpptr;
 	char path[PATH_MAX];
 
 	/* sanity checking */
@@ -129,7 +129,7 @@ catopen(const char *name, int type)
 		lang = NULL;
 	else {
 		if (type == NL_CAT_LOCALE)
-			lang = setlocale(LC_MESSAGES, NULL);
+			lang = querylocale(LC_MESSAGES_MASK, __get_locale());
 		else
 			lang = getenv("LANG");
 


More information about the svn-src-all mailing list