mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
perf test: Skip shebang and SPDX comments in shell test descriptions
When extracting shell test descriptions in tests-scripts.c, the parser skipped the first line assuming it was the shebang (#!/bin/sh) and then read the first comment line on line 2 as the test description. However, checkpatch.pl expects shell scripts to declare their SPDX license identifier on line 2 (# SPDX-License-Identifier: ...). This caused the test harness to extract the SPDX license string as the test description. Refactor shell_test__description to use io__getline, skipping both shebang and SPDX comment lines. This allows shell tests to include standard SPDX headers without breaking test suite description extraction. Assisted-by: Gemini-CLI:Google Gemini 3 Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
94ac3ce427
commit
85fe2fdb27
|
|
@ -31,6 +31,7 @@ static int shell_tests__dir_fd(void)
|
|||
{
|
||||
struct stat st;
|
||||
char path[PATH_MAX], path2[PATH_MAX], *exec_path;
|
||||
ssize_t len;
|
||||
static const char * const devel_dirs[] = {
|
||||
"./tools/perf/tests/shell",
|
||||
"./tests/shell",
|
||||
|
|
@ -47,13 +48,17 @@ static int shell_tests__dir_fd(void)
|
|||
}
|
||||
|
||||
/* Use directory of executable */
|
||||
if (readlink("/proc/self/exe", path2, sizeof path2) < 0)
|
||||
len = readlink("/proc/self/exe", path2, sizeof(path2) - 1);
|
||||
if (len < 0)
|
||||
return -1;
|
||||
path2[len] = '\0';
|
||||
/* Follow another level of symlink if there */
|
||||
if (lstat(path2, &st) == 0 && (st.st_mode & S_IFMT) == S_IFLNK) {
|
||||
scnprintf(path, sizeof(path), path2);
|
||||
if (readlink(path, path2, sizeof path2) < 0)
|
||||
scnprintf(path, sizeof(path), "%s", path2);
|
||||
len = readlink(path, path2, sizeof(path2) - 1);
|
||||
if (len < 0)
|
||||
return -1;
|
||||
path2[len] = '\0';
|
||||
}
|
||||
/* Get directory */
|
||||
p = strrchr(path2, '/');
|
||||
|
|
@ -78,43 +83,50 @@ static int shell_tests__dir_fd(void)
|
|||
static char *shell_test__description(int dir_fd, const char *name)
|
||||
{
|
||||
struct io io;
|
||||
char buf[128], desc[256];
|
||||
int ch, pos = 0;
|
||||
char buf[128], *line = NULL;
|
||||
size_t line_len = 0;
|
||||
ssize_t len;
|
||||
char *desc = NULL;
|
||||
const char *spdx = "SPDX-License";
|
||||
|
||||
io__init(&io, openat(dir_fd, name, O_RDONLY), buf, sizeof(buf));
|
||||
if (io.fd < 0)
|
||||
return NULL;
|
||||
|
||||
/* Skip first line - should be #!/bin/bash Shebang */
|
||||
if (io__get_char(&io) != '#')
|
||||
goto err_out;
|
||||
if (io__get_char(&io) != '!')
|
||||
goto err_out;
|
||||
do {
|
||||
ch = io__get_char(&io);
|
||||
if (ch < 0)
|
||||
goto err_out;
|
||||
} while (ch != '\n');
|
||||
while ((len = io__getline(&io, &line, &line_len)) > 0) {
|
||||
char *p = line;
|
||||
|
||||
do {
|
||||
ch = io__get_char(&io);
|
||||
if (ch < 0)
|
||||
goto err_out;
|
||||
} while (ch == '#' || isspace(ch));
|
||||
while (ch > 0 && ch != '\n') {
|
||||
desc[pos++] = ch;
|
||||
if (pos >= (int)sizeof(desc) - 1)
|
||||
/* Skip leading whitespace */
|
||||
while (*p && isspace(*p))
|
||||
p++;
|
||||
|
||||
/* Must be a comment */
|
||||
if (*p != '#')
|
||||
continue;
|
||||
p++;
|
||||
|
||||
/* Skip shebang or SPDX lines */
|
||||
if (*p == '!' || (strstr(p, spdx) && strstr(p, "-Identifier:")))
|
||||
continue;
|
||||
|
||||
/* Skip whitespace after # */
|
||||
while (*p && isspace(*p))
|
||||
p++;
|
||||
|
||||
/* If we found non-empty text, this is the description! */
|
||||
if (*p && *p != '\n') {
|
||||
char *end = p + strlen(p);
|
||||
|
||||
while (end > p && isspace(end[-1]))
|
||||
end--;
|
||||
*end = '\0';
|
||||
desc = strdup(p);
|
||||
break;
|
||||
ch = io__get_char(&io);
|
||||
}
|
||||
}
|
||||
while (pos > 0 && isspace(desc[--pos]))
|
||||
;
|
||||
desc[++pos] = '\0';
|
||||
free(line);
|
||||
close(io.fd);
|
||||
return strdup(desc);
|
||||
err_out:
|
||||
close(io.fd);
|
||||
return NULL;
|
||||
return desc;
|
||||
}
|
||||
|
||||
/* Is this full file path a shell script */
|
||||
|
|
@ -178,9 +190,9 @@ static void append_script(int dir_fd, const char *name, char *desc,
|
|||
char *exclusive;
|
||||
|
||||
snprintf(link, sizeof(link), "/proc/%d/fd/%d", getpid(), dir_fd);
|
||||
len = readlink(link, filename, sizeof(filename));
|
||||
if (len < 0) {
|
||||
pr_err("Failed to readlink %s", link);
|
||||
len = readlink(link, filename, sizeof(filename) - 1);
|
||||
if (len < 0 || (size_t)len > sizeof(filename) - strlen(name) - 2) {
|
||||
pr_err("Failed to readlink %s or path too long", link);
|
||||
return;
|
||||
}
|
||||
filename[len++] = '/';
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user