tools/rv: Fix substring match bug in monitor name search

__ikm_find_monitor_name() relies on strstr() to find a monitor by name,
which fails if the target monitor is a substring of a previously listed
monitor.

Fix it by tokenizing the available_monitors file and matching full
tokens instead.

Fixes: eba321a16f ("tools/rv: Add support for nested monitors")
Reviewed-by: Nam Cao <namcao@linutronix.de>
Link: https://lore.kernel.org/r/20260514152055.229162-2-gmonaco@redhat.com
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
This commit is contained in:
Gabriele Monaco 2026-05-14 17:20:42 +02:00
parent 08904765bb
commit a963fbf316

View File

@ -58,38 +58,40 @@ static int __ikm_read_enable(char *monitor_name)
*/
static int __ikm_find_monitor_name(char *monitor_name, char *out_name)
{
char *available_monitors, container[MAX_DA_NAME_LEN+1], *cursor, *end;
int retval = 1;
char *available_monitors, *cursor, *line;
int len = strlen(monitor_name);
int found = 0;
available_monitors = tracefs_instance_file_read(NULL, "rv/available_monitors", NULL);
if (!available_monitors)
return -1;
cursor = strstr(available_monitors, monitor_name);
if (!cursor) {
retval = 0;
goto out_free;
config_is_container = 0;
cursor = available_monitors;
while ((line = strsep(&cursor, "\n"))) {
char *colon = strchr(line, ':');
if (strcmp(line, monitor_name) && (!colon || strcmp(colon + 1, monitor_name)))
continue;
strncpy(out_name, line, 2 * MAX_DA_NAME_LEN);
out_name[2 * MAX_DA_NAME_LEN - 1] = '\0';
if (colon) {
out_name[colon - line] = '/';
} else {
/* If there are children, they are on the next line. */
line = strsep(&cursor, "\n");
if (line && !strncmp(line, monitor_name, len) && line[len] == ':')
config_is_container = 1;
}
found = 1;
break;
}
for (; cursor > available_monitors; cursor--)
if (*(cursor-1) == '\n')
break;
end = strstr(cursor, "\n");
memcpy(out_name, cursor, end-cursor);
out_name[end-cursor] = '\0';
cursor = strstr(out_name, ":");
if (cursor)
*cursor = '/';
else {
sprintf(container, "%s:", monitor_name);
if (strstr(available_monitors, container))
config_is_container = 1;
}
out_free:
free(available_monitors);
return retval;
return found;
}
/*