fix duplocale clobbering of new locale struct with memcpy of old
authorRich Felker <dalias@aerifal.cx>
Tue, 21 Apr 2015 17:50:11 +0000 (13:50 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 21 Apr 2015 17:54:58 +0000 (13:54 -0400)
when the non-stub duplocale code was added as part of the locale
framework in commit 0bc03091bb674ebb9fa6fe69e4aec1da3ac484f2, the old
code to memcpy the old locale object to the new one was left behind.
the conditional for the memcpy no longer makes sense, because the
conditions are now always-true when it's reached, and the memcpy is
wrong because it clobbers the new->messages_name pointer setup just
above.

since the messages_name and ctype_utf8 members have already been
copied, all that remains is the cat[] array. these pointers are
volatile, so using memcpy to copy them is formally wrong; use a for
loop instead.

src/locale/duplocale.c

index 133687071df766c9884e814d88b616b54b7b25c2..b87c933e4d27f30aac5169d4a682871ddeb9565e 100644 (file)
@@ -14,7 +14,8 @@ locale_t __duplocale(locale_t old)
        if (old->messages_name)
                strcpy(new->messages_name, old->messages_name);
 
-       if (new && old != LC_GLOBAL_LOCALE) memcpy(new, old, sizeof *new);
+       for (size_t i=0; i<sizeof new->cat/sizeof new->cat[0]; i++)
+               new->cat[i] = old->cat[i];
        return new;
 }