fix integer overflow in elf.h macro SHF_EXCLUDE
[musl] / src / locale / __setlocalecat.c
index bbecde4..c93e9ba 100644 (file)
@@ -4,13 +4,20 @@
 #include "libc.h"
 #include "atomic.h"
 
+const char *__lctrans_impl(const char *msg, const struct __locale_map *lm)
+{
+       const char *trans = 0;
+       if (lm) trans = __mo_lookup(lm->map, lm->map_size, msg);
+       return trans ? trans : msg;
+}
+
 const unsigned char *__map_file(const char *, size_t *);
 int __munmap(void *, size_t);
 char *__strchrnul(const char *, int);
 
 static struct __locale_map *findlocale(const char *name, size_t n)
 {
-       static void *loc_head;
+       static void *volatile loc_head;
        struct __locale_map *p, *new, *old_head;
        const char *path = 0, *z;
        char buf[256];
@@ -21,8 +28,6 @@ static struct __locale_map *findlocale(const char *name, size_t n)
        for (p=loc_head; p; p=p->next)
                if (!strcmp(name, p->name)) return p;
 
-       if (strchr(name, '/')) return 0;
-
        if (!libc.secure) path = getenv("MUSL_LOCPATH");
        /* FIXME: add a default path? */
        if (!path) return 0;
@@ -74,7 +79,9 @@ int __setlocalecat(locale_t loc, int cat, const char *val)
                (val = "C.UTF-8");
        }
 
-       size_t n = strnlen(val, LOCALE_NAME_MAX);
+       size_t n;
+       for (n=0; n<LOCALE_NAME_MAX && val[n] && val[n]!='/'; n++);
+       if (val[0]=='.' || val[n]) val = "C.UTF-8";
        int builtin = (val[0]=='C' && !val[1])
                || !strcmp(val, "C.UTF-8")
                || !strcmp(val, "POSIX");