public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Szabolcs Nagy <nsz@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/arm/morello/main] cheri: malloc: Fix realloc to copy all relevant bytes Date: Mon, 19 Dec 2022 15:31:40 +0000 (GMT) [thread overview] Message-ID: <20221219153140.894D43858D28@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=bbce0c75f35f55b9f5e43dd4fa01a82cc27bf020 commit bbce0c75f35f55b9f5e43dd4fa01a82cc27bf020 Author: Szabolcs Nagy <szabolcs.nagy@arm.com> Date: Mon Dec 19 13:18:10 2022 +0000 cheri: malloc: Fix realloc to copy all relevant bytes 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. Diff: --- malloc/malloc.c | 4 ++-- malloc/tst-realloc.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/malloc/malloc.c b/malloc/malloc.c index 392116a5ac..ededc5cfe2 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -3762,9 +3762,9 @@ __libc_realloc (void *oldmem, size_t bytes) 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; } diff --git a/malloc/tst-realloc.c b/malloc/tst-realloc.c index 5eb62a770f..2e14d318ab 100644 --- a/malloc/tst-realloc.c +++ b/malloc/tst-realloc.c @@ -83,6 +83,25 @@ do_test (void) 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.");
reply other threads:[~2022-12-19 15:31 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221219153140.894D43858D28@sourceware.org \ --to=nsz@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).