tracing: Avoid NULL return from hist_field_name() on truncation
[ 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> Signed-off-by: Ulrich Hecht <uli@kernel.org>
This commit is contained in:
1 parent
fd514dffdd
commit
213cd4a5d7
1 file changed
+2
-4
@@ -1821,10 +1821,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)
|
||||
|
||||
Reference in new issue
Block a user