fix memset overflow in oldmalloc race fix overhaul
authorRich Felker <dalias@aerifal.cx>
Tue, 16 Jun 2020 04:34:12 +0000 (00:34 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 16 Jun 2020 04:46:09 +0000 (00:46 -0400)
commit 3e16313f8fe2ed143ae0267fd79d63014c24779f introduced this bug by
making the copy case reachable with n (new size) smaller than n0
(original size). this was left as the only way of shrinking an
allocation because it reduces fragmentation if a free chunk of the
appropriate size is available. when that's not the case, another
approach may be better, but any such improvement would be independent
of fixing this bug.

src/malloc/oldmalloc/malloc.c

index 0a38690c628a584a2820f268bb49fa33afc8a61f..52af19759171d28514470a4e3afe96ab28ed4d49 100644 (file)
@@ -409,7 +409,7 @@ copy_realloc:
        new = malloc(n-OVERHEAD);
        if (!new) return 0;
 copy_free_ret:
-       memcpy(new, p, n0-OVERHEAD);
+       memcpy(new, p, (n<n0 ? n : n0) - OVERHEAD);
        free(CHUNK_TO_MEM(self));
        return new;
 }