[PATCH] tracing: fix kstrdup leak on repeated trigger keywords

From: Tang Bin

Date: Mon Oct 26 2026 - 08:03:10 EST


parse_assignment() overwrites
attrs->keys_str/vals_str/sort_key_str/name/clock with a fresh kstrdup()
without freeing a previously assigned value. A hist trigger string with
repeated keywords (e.g. 'keys=pid:keys=comm') leaks the earlier allocation
each time. kfree() the old pointer before reassigning (attrs is kzalloc'd
so the first call sees NULL).

Fixes: b527b638fd63 ("tracing: Simplify assignment parsing for hist triggers")
Signed-off-by: Tang Bin <tangbin@xxxxxxxxxxxxxxxxxxxx>
---
kernel/trace/trace_events_hist.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 8af97fd4e..4ce857072 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -1481,6 +1481,7 @@ static int parse_assignment(struct trace_array *tr,

if ((len = str_has_prefix(str, "key=")) ||
(len = str_has_prefix(str, "keys="))) {
+ kfree(attrs->keys_str);
attrs->keys_str = kstrdup(str + len, GFP_KERNEL);
if (!attrs->keys_str) {
ret = -ENOMEM;
@@ -1489,18 +1490,21 @@ static int parse_assignment(struct trace_array *tr,
} else if ((len = str_has_prefix(str, "val=")) ||
(len = str_has_prefix(str, "vals=")) ||
(len = str_has_prefix(str, "values="))) {
+ kfree(attrs->vals_str);
attrs->vals_str = kstrdup(str + len, GFP_KERNEL);
if (!attrs->vals_str) {
ret = -ENOMEM;
goto out;
}
} else if ((len = str_has_prefix(str, "sort="))) {
+ kfree(attrs->sort_key_str);
attrs->sort_key_str = kstrdup(str + len, GFP_KERNEL);
if (!attrs->sort_key_str) {
ret = -ENOMEM;
goto out;
}
} else if (str_has_prefix(str, "name=")) {
+ kfree(attrs->name);
attrs->name = kstrdup(str, GFP_KERNEL);
if (!attrs->name) {
ret = -ENOMEM;
@@ -1510,6 +1514,7 @@ static int parse_assignment(struct trace_array *tr,
str += len;

str = strstrip(str);
+ kfree(attrs->clock);
attrs->clock = kstrdup(str, GFP_KERNEL);
if (!attrs->clock) {
ret = -ENOMEM;
--
2.52.0.windows.1