fix use of uninitialized pointer in gettext core
authorRich Felker <dalias@aerifal.cx>
Sun, 29 Jan 2017 16:14:00 +0000 (11:14 -0500)
committerRich Felker <dalias@aerifal.cx>
Sun, 29 Jan 2017 16:14:00 +0000 (11:14 -0500)
the plural_rule field of allocated msgcat structures was assumed to be
initially-null but was never initialized. for future-proofing, the
nplurals field which was left uninitialized should also be cleared.

likewise, in the binding structure, the active field could be used
uninitialized by a technicality: the a_store which stores the initial
value of 0 may be implemented as a cas operation, which reads the old
value.

rather than fixing these issues individually, just use calloc for both
allocations. this does result in wasteful clearing of name buffers (up
to NAME_MAX+PATH_MAX) before filling them, but since the size if
bounded and the time is dominated by filesystem operations, it really
doesn't matter; simplicity and future-proofing have more value here.

modified from patch submitted by He X.

src/locale/dcngettext.c

index e48c50f03a2e936e58a5dbf5d667b393372e77a3..73a9fd707b592d45cc43ae571c20ae05f99e83dc 100644 (file)
@@ -57,7 +57,7 @@ char *bindtextdomain(const char *domainname, const char *dirname)
        }
 
        if (!p) {
-               p = malloc(sizeof *p + domlen + dirlen + 2);
+               p = calloc(sizeof *p + domlen + dirlen + 2, 1);
                if (!p) {
                        UNLOCK(lock);
                        return 0;
@@ -171,7 +171,7 @@ notrans:
                size_t map_size;
                const void *map = __map_file(name, &map_size);
                if (!map) goto notrans;
-               p = malloc(sizeof *p + namelen + 1);
+               p = calloc(sizeof *p + namelen + 1, 1);
                if (!p) {
                        __munmap((void *)map, map_size);
                        goto notrans;