New code in realloc that handles when new allocation is needed for
alignment reasons (for capability narrowing) used the wrong size in
memcpy (size was off by SIZE_SZ unless memory tagging was enabled)
and used wrongly tagged pointer for untagging the old memory.
Due to this bug realloc sometimes failed to copy tail bytes of an old
allocation to the new allocation when capability narrowing is enabled.
void *newmem = _mid_memalign (align, bytes, 0);
if (!cap_narrow_check (newmem, oldmem))
return newmem;
- size_t sz = oldsize - CHUNK_HDR_SZ;
+ size_t sz = memsize (oldp);
memcpy (newmem, oldmem, sz < bytes ? sz : bytes);
- (void) tag_region (oldmem, sz);
+ (void) tag_region (chunk2mem (oldp), sz);
_int_free (ar_ptr, oldp, 0);
return newmem;
}
free (p);
+ /* Check as above with larger size increase. */
+ p = malloc (34);
+ if (p == NULL)
+ FAIL_EXIT1 ("malloc (34) failed.");
+ memset (p, 'a', 34);
+ p = realloc (p, 80000);
+ if (p == NULL)
+ FAIL_EXIT1 ("realloc (p, 80000) failed.");
+ c = p;
+ ok = 1;
+ for (i = 0; i < 34; i++)
+ {
+ if (c[i] != 'a')
+ ok = 0;
+ }
+ if (ok == 0)
+ FAIL_EXIT1 ("first 34 bytes were not preserved");
+ free (p);
+
p = realloc (NULL, 100);
if (p == NULL)
FAIL_EXIT1 ("realloc (NULL, 100) failed.");