struct binding {
struct binding *next;
int dirlen;
- int active;
+ volatile int active;
char *domainname;
char *dirname;
char buf[];
char *bindtextdomain(const char *domainname, const char *dirname)
{
- static int lock[2];
+ static volatile int lock[2];
struct binding *p, *q;
if (!domainname) return 0;
struct msgcat *next;
const void *map;
size_t map_size;
- void *plural_rule;
- int nplurals;
+ void *volatile plural_rule;
+ volatile int nplurals;
char name[];
};
switch (category) {
case LC_MESSAGES:
locname = loc->messages_name;
- if (!*locname) goto notrans;
+ if (!locname || !*locname) goto notrans;
break;
case LC_TIME:
case LC_MONETARY:
unsigned long plural = __pleval(p->plural_rule, n);
if (plural > p->nplurals) goto notrans;
while (plural--) {
- size_t l = strlen(trans);
- if (l+1 >= p->map_size - (trans - (char *)p->map))
+ size_t rem = p->map_size - (trans - (char *)p->map);
+ size_t l = strnlen(trans, rem);
+ if (l+1 >= rem)
goto notrans;
trans += l+1;
}