summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2016-08-26 21:23:38 +0000
committerache <ache@FreeBSD.org>2016-08-26 21:23:38 +0000
commit0d768c2ef106c5f2eb03b95b7642ecacec31fdca (patch)
tree88687c4ef3b1e49996a6c89308f8060709d1b716 /lib/libc
parent97f52eb25d342714fc2336d2ab18039159379fd0 (diff)
downloadFreeBSD-src-0d768c2ef106c5f2eb03b95b7642ecacec31fdca.zip
FreeBSD-src-0d768c2ef106c5f2eb03b95b7642ecacec31fdca.tar.gz
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
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/nls/msgcat.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/libc/nls/msgcat.c b/lib/libc/nls/msgcat.c
index 3df76b6..f2d9584 100644
--- a/lib/libc/nls/msgcat.c
+++ b/lib/libc/nls/msgcat.c
@@ -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");
OpenPOWER on IntegriCloud