From: Simon Glass <simon.glass@canonical.com>
The mcheck heap protection stores a caller string in each allocation
header for debugging purposes. The length is hard-coded to 48 bytes in
mcheck_core.inc.h
Add a CONFIG_MCHECK_CALLER_LEN Kconfig option to make this configurable,
allowing users to adjust the trade-off between the amount of debugging
context and the memory overhead per allocation.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
Kconfig | 11 +++++++++++
common/mcheck_core.inc.h | 5 ++---
2 files changed, 13 insertions(+), 3 deletions(-)
@@ -355,6 +355,17 @@ config MCHECK_HEAP_PROTECTION
significantly increases memory overhead and should only be used for
debugging.
+config MCHECK_CALLER_LEN
+ int "Length of caller string in mcheck header"
+ depends on MCHECK_HEAP_PROTECTION
+ default 48
+ help
+ Sets the maximum length of the caller string stored in each
+ allocation header. This string records the function/file/line
+ that allocated the memory, useful for debugging memory leaks.
+ Larger values provide more context but increase memory overhead
+ per allocation.
+
config SPL_SYS_MALLOC_F
bool "Enable malloc() pool in SPL"
depends on SPL_FRAMEWORK && SYS_MALLOC_F && SPL
@@ -73,7 +73,6 @@
// Full test suite can exceed 10000 concurrent allocations
#define REGISTRY_SZ 12000
#define CANARY_DEPTH 2
-#define MCHECK_CALLER_LEN 48
// avoid problems with BSS at early stage:
static char mcheck_pedantic_flag __section(".data") = 0;
@@ -89,7 +88,7 @@ struct mcheck_hdr {
size_t size; /* Exact size requested by user. */
size_t aln_skip; /* Ignored bytes, before the mcheck_hdr, to fulfill alignment */
mcheck_canary canary; /* Magic number to check header integrity. */
- char caller[MCHECK_CALLER_LEN]; /* caller info for debugging */
+ char caller[CONFIG_MCHECK_CALLER_LEN]; /* caller info for debugging */
};
static void mcheck_default_abort(enum mcheck_status status, const void *p)
@@ -212,7 +211,7 @@ static void *mcheck_allocated_helper(void *altoghether_ptr, size_t customer_sz,
for (i = 0; i < CANARY_DEPTH; ++i)
hdr->canary.elems[i] = MAGICWORD;
if (caller)
- strlcpy(hdr->caller, caller, MCHECK_CALLER_LEN);
+ strlcpy(hdr->caller, caller, CONFIG_MCHECK_CALLER_LEN);
else
hdr->caller[0] = '\0';