From ed84fb95a3c1dd2ffb23e25916b2c5ff23f085a8 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 19 Feb 2024 21:03:06 +0100 Subject: [PATCH] 5.4-stable patches added patches: tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch --- queue-5.4/series | 1 + ...memleak-of-saved_cmdlines-allocation.patch | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 queue-5.4/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch diff --git a/queue-5.4/series b/queue-5.4/series index a46878514f7..d4bcb1a4288 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -244,3 +244,4 @@ nfp-flower-prevent-re-adding-mac-index-for-bonded-port.patch irqchip-irq-brcmstb-l2-add-write-memory-barrier-before-exit.patch can-j1939-fix-uaf-in-j1939_sk_match_filter-during-setsockopt-so_j1939_filter.patch pmdomain-core-move-the-unused-cleanup-to-a-_sync-initcall.patch +tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch diff --git a/queue-5.4/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch b/queue-5.4/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch new file mode 100644 index 00000000000..eb3a699ed53 --- /dev/null +++ b/queue-5.4/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch @@ -0,0 +1,94 @@ +From 2394ac4145ea91b92271e675a09af2a9ea6840b7 Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (Google)" +Date: Wed, 14 Feb 2024 11:20:46 -0500 +Subject: tracing: Inform kmemleak of saved_cmdlines allocation + +From: Steven Rostedt (Google) + +commit 2394ac4145ea91b92271e675a09af2a9ea6840b7 upstream. + +The allocation of the struct saved_cmdlines_buffer structure changed from: + + s = kmalloc(sizeof(*s), GFP_KERNEL); + s->saved_cmdlines = kmalloc_array(TASK_COMM_LEN, val, GFP_KERNEL); + +to: + + orig_size = sizeof(*s) + val * TASK_COMM_LEN; + order = get_order(orig_size); + size = 1 << (order + PAGE_SHIFT); + page = alloc_pages(GFP_KERNEL, order); + if (!page) + return NULL; + + s = page_address(page); + memset(s, 0, sizeof(*s)); + + s->saved_cmdlines = kmalloc_array(TASK_COMM_LEN, val, GFP_KERNEL); + +Where that s->saved_cmdlines allocation looks to be a dangling allocation +to kmemleak. That's because kmemleak only keeps track of kmalloc() +allocations. For allocations that use page_alloc() directly, the kmemleak +needs to be explicitly informed about it. + +Add kmemleak_alloc() and kmemleak_free() around the page allocation so +that it doesn't give the following false positive: + +unreferenced object 0xffff8881010c8000 (size 32760): + comm "swapper", pid 0, jiffies 4294667296 + hex dump (first 32 bytes): + ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ + ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ + backtrace (crc ae6ec1b9): + [] kmemleak_alloc+0x45/0x80 + [] __kmalloc_large_node+0x10d/0x190 + [] __kmalloc+0x3b1/0x4c0 + [] allocate_cmdlines_buffer+0x113/0x230 + [] tracer_alloc_buffers.isra.0+0x124/0x460 + [] early_trace_init+0x14/0xa0 + [] start_kernel+0x12e/0x3c0 + [] x86_64_start_reservations+0x18/0x30 + [] x86_64_start_kernel+0x7b/0x80 + [] secondary_startup_64_no_verify+0x15e/0x16b + +Link: https://lore.kernel.org/linux-trace-kernel/87r0hfnr9r.fsf@kernel.org/ +Link: https://lore.kernel.org/linux-trace-kernel/20240214112046.09a322d6@gandalf.local.home + +Cc: Masami Hiramatsu +Cc: Mathieu Desnoyers +Cc: Catalin Marinas +Fixes: 44dc5c41b5b1 ("tracing: Fix wasted memory in saved_cmdlines logic") +Reported-by: Kalle Valo +Tested-by: Kalle Valo +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Greg Kroah-Hartman +--- + kernel/trace/trace.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1996,6 +1997,7 @@ static void free_saved_cmdlines_buffer(s + int order = get_order(sizeof(*s) + s->cmdline_num * TASK_COMM_LEN); + + kfree(s->map_cmdline_to_pid); ++ kmemleak_free(s); + free_pages((unsigned long)s, order); + } + +@@ -2015,6 +2017,7 @@ static struct saved_cmdlines_buffer *all + return NULL; + + s = page_address(page); ++ kmemleak_alloc(s, size, 1, GFP_KERNEL); + memset(s, 0, sizeof(*s)); + + /* Round up to actual allocation */ -- 2.47.3