]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tracing: Avoid NULL return from hist_field_name() on truncation
authorDavid Carlier <devnexen@gmail.com>
Fri, 8 May 2026 19:57:47 +0000 (20:57 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jun 2026 15:46:32 +0000 (17:46 +0200)
[ Upstream commit 576ec047d20b368b43c4d5db98c4f2e0f3c101ec ]

hist_field_name() returns "" everywhere except the fully-qualified
VAR_REF/EXPR case, where snprintf() truncation returns NULL early
and bypasses the bottom NULL->"" guard. Callers don't expect NULL:
strcat(expr, hist_field_name(field, 0)) at trace_events_hist.c:1758
and the strcmp() in the sort-key match loop at :4804 both deref it.

system and event_name are bounded by MAX_EVENT_NAME_LEN, but the
field name on a VAR_REF is kstrdup'd from a histogram variable
name parsed out of the trigger string and has no length cap, so
a long enough var name in a fully qualified reference can reach
the truncation path.

Keep the length check but leave field_name as "" on overflow.

Link: https://patch.msgid.link/20260508195747.25492-1-devnexen@gmail.com
Fixes: 5ec1d1e97de1 ("tracing: Rebuild full_name on each hist_field_name() call")
Signed-off-by: David Carlier <devnexen@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/trace/trace_events_hist.c

index 2d085115afde37c9279a333a3d783877fc55cb20..2a1e3537332d5d11a78d98f4475eba1845947d7c 100644 (file)
@@ -1347,10 +1347,8 @@ static const char *hist_field_name(struct hist_field *field,
                        len = snprintf(full_name, sizeof(full_name), "%s.%s.%s",
                                       field->system, field->event_name,
                                       field->name);
-                       if (len >= sizeof(full_name))
-                               return NULL;
-
-                       field_name = full_name;
+                       if (len < sizeof(full_name))
+                               field_name = full_name;
                } else
                        field_name = field->name;
        } else if (field->flags & HIST_FIELD_FL_TIMESTAMP)