From: Greg Kroah-Hartman Date: Mon, 19 Feb 2024 20:03:24 +0000 (+0100) Subject: 5.10-stable patches X-Git-Tag: v4.19.307~94 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e275d11b0d1d524852830d1d81880b40a098f449;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch --- diff --git a/queue-5.10/series b/queue-5.10/series index 804b0263fdb..7267225166a 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -347,3 +347,4 @@ ceph-prevent-use-after-free-in-encode_cap_msg.patch of-property-fix-typo-in-io-channels.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.10/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch b/queue-5.10/tracing-inform-kmemleak-of-saved_cmdlines-allocation.patch new file mode 100644 index 00000000000..37d9ca3cce9 --- /dev/null +++ b/queue-5.10/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 +@@ -2258,6 +2259,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); + } + +@@ -2277,6 +2279,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 */