From patchwork Sat Jan 3 01:18:47 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1205 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403212; bh=We7uXnITjy38nZUN4W91aVJwCXPs9r15sAZWwXeOPUQ=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=wb/+gzfzjMTw0uht0VG3TLNkOZ82avITkCR4nc/0PVSuuPtpNSUlIptj/jNx39ysm cDQ8uJ1t+ZfqXLtQ5iOjYvr0smxS9yR42HiQWozCpiVprPwjZEtne+NlJiTekmkieh h/zCPGnRlew/koNpKJ1bSvtMewrvlcF/KW0ygAL3sjWEJqf9BWUO2jBt6aevy+AKjC Ozl2JiiFqY2Mk2rDq2GbVp4PnBfcKgg6rfCwwYmsMmHBHwUc1Juav2Y8DGA3IOwLbM KS2tmxX/JyTdcXDKuI4eBLTWt1zbxYmdW2ytAI9gS4F8641+sEr+2KWgXbt8yILbYG 0JopU9worgZjQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 15EFF6904E for ; Fri, 2 Jan 2026 18:20:12 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id D6sbwtM5FmDw for ; Fri, 2 Jan 2026 18:20:12 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403212; bh=We7uXnITjy38nZUN4W91aVJwCXPs9r15sAZWwXeOPUQ=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=wb/+gzfzjMTw0uht0VG3TLNkOZ82avITkCR4nc/0PVSuuPtpNSUlIptj/jNx39ysm cDQ8uJ1t+ZfqXLtQ5iOjYvr0smxS9yR42HiQWozCpiVprPwjZEtne+NlJiTekmkieh h/zCPGnRlew/koNpKJ1bSvtMewrvlcF/KW0ygAL3sjWEJqf9BWUO2jBt6aevy+AKjC Ozl2JiiFqY2Mk2rDq2GbVp4PnBfcKgg6rfCwwYmsMmHBHwUc1Juav2Y8DGA3IOwLbM KS2tmxX/JyTdcXDKuI4eBLTWt1zbxYmdW2ytAI9gS4F8641+sEr+2KWgXbt8yILbYG 0JopU9worgZjQ== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 042FB6904D for ; Fri, 2 Jan 2026 18:20:12 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403210; bh=//HNZAvV12GZMTqnLU5++m4bipEn6OC5J0Bc/0dvQAc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dm42qvj4xeZaCYxTRs+MXkR4rwS5Igv6/k8cJ5aotb4+WBEUxJ+Nb1eLlLxRb1afL sscCu8WshrgZZn+7wSDgUxIkgjSDLctPNSeTmYcDtT3qNst1G4c6ng/XF1ShKHMqBu 9KKDvWye5bVjfMDL4HcUJ+tCo3BLZ/RBIlFl7u6bFc7NcNoDPBGYJ8/QfmD21jRfoR E6IrRIBN3XnGFqqxNAxwLEMdYutDwnc0jbw8QLxCEKk2gYFW1exh+Hx7nC77y32lvZ GfpCaY60U16xJcfw8uZ+CkUreBQe998pGRy0Ux1rOBfKqusntv3ccJeFICx8lK57jI YcPc4wvgZEaJg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 2AADB6904E; Fri, 2 Jan 2026 18:20:10 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id PuhWCVvWk-BU; Fri, 2 Jan 2026 18:20:10 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767403204; bh=TwTGG0+cfGMpqQzDLEIE8kJ0Pe+f1e6Se8GmIn/sFls=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MsKCYiCwG+/na9BaKSMos4TtPTRSszip76J86CKesh1VabpKBpjcB8uzazlt2y7Wx 9pCbdBpFOOIuDejmdAVXM702lBpPfXHQD4HKIQwN6+8+vO4XFipOLbSEFHqfe1sb27 MD62/oQCcbRfcOqX5YSXLmcQ0MwmOcrv13QkB5a7nO2apLNSVc620FtZ4cD+nVP5S6 QENvbHHw77NjfRh09kecDZHrIO1NXjdTicgVNl9rAvNy1T7wroGBH4kL39lMZQmxsm K6bWFa61YCRrmk/Aeb94V9H0cvHodgku4BKZh3fhOmEN8b5wotqrg3K7KpvPogzpax 9G6GAMwJ4YQHQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id C82FE68BF2; Fri, 2 Jan 2026 18:20:03 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Fri, 2 Jan 2026 18:18:47 -0700 Message-ID: <20260103011908.149445-12-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260103011908.149445-1-sjg@u-boot.org> References: <20260103011908.149445-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: CJWU2ALKBGXVTFTHCYAYX3XJ6QZ6TFDR X-Message-ID-Hash: CJWU2ALKBGXVTFTHCYAYX3XJ6QZ6TFDR X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 11/24] malloc: Fix malloc_usable_size() to handle mcheck headers List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass When mcheck is enabled, malloc_usable_size() returns incorrect results because mem2chunk() is called on the offset user pointer rather than the actual chunk. The pointer returned to the user is offset by the mcheck header, but malloc_usable_size() is unaware of this. Add a wrapper that returns the user-requested size stored in the mcheck header. This fixes test failures when CONFIG_MCHECK_CALLER_LEN is set to larger values. Also add a wrapper for the case where MALLOC_DEBUG is enabled without MCHECK_HEAP_PROTECTION, since MALLOC_DEBUG makes dlmalloc_usable_size_impl() static but no public dlmalloc_usable_size exists outside the mcheck block. Co-developed-by: Claude Signed-off-by: Simon Glass --- common/dlmalloc.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 78efdf5fd9a..71f81aeaec7 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -648,6 +648,7 @@ static inline void MALLOC_COPY(void *dest, const void *src, size_t sz) { memcpy( #define dlrealloc_impl dlrealloc #define dlmemalign_impl dlmemalign #define dlcalloc_impl dlcalloc +#define dlmalloc_usable_size_impl dlmalloc_usable_size #endif static bool malloc_testing; /* enable test mode */ @@ -5943,13 +5944,15 @@ int dlmallopt(int param_number, int value) { return change_mparam(param_number, value); } -size_t dlmalloc_usable_size(const void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk((void*)mem); - if (is_inuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; +STATIC_IF_MCHECK size_t dlmalloc_usable_size_impl(const void *mem) +{ + if (mem != 0) { + mchunkptr p = mem2chunk((void *)mem); + + if (is_inuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; } #if CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) @@ -6098,6 +6101,20 @@ void *dlcalloc(size_t n, size_t elem_size) return mcheck_alloc_noclean_posthook(p, n * elem_size, mcheck_caller()); } +size_t dlmalloc_usable_size(const void *mem) +{ + if (!mem) + return 0; + + if (mcheck_disabled) + return dlmalloc_usable_size_impl(mem); + + /* Return the user-requested size from mcheck header */ + const struct mcheck_hdr *hdr = &((const struct mcheck_hdr *)mem)[-1]; + + return hdr->size; +} + /* mcheck API */ int mcheck_pedantic(mcheck_abortfunc_t f) { @@ -6145,6 +6162,14 @@ void *dlcalloc(size_t n, size_t elem_size) } #endif /* MCHECK_HEAP_PROTECTION */ +#if CONFIG_IS_ENABLED(MALLOC_DEBUG) && !CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) +/* Wrapper needed when MALLOC_DEBUG makes dlmalloc_usable_size_impl static */ +size_t dlmalloc_usable_size(const void *mem) +{ + return dlmalloc_usable_size_impl(mem); +} +#endif + #if !CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) /* Stub when mcheck is not enabled */ void mcheck_set_disabled(bool disabled)