]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf test: Skip shebang and SPDX comments in shell test descriptions
authorIan Rogers <irogers@google.com>
Tue, 2 Jun 2026 17:41:23 +0000 (10:41 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 4 Jun 2026 14:40:36 +0000 (11:40 -0300)
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>
tools/perf/tests/tests-scripts.c

index f18c4cd337c8f679894b173e95e1acca055848cf..0370bc7013737e31567d8cfc19a3aba123c917a2 100644 (file)
@@ -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');
-
-       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)
+       while ((len = io__getline(&io, &line, &line_len)) > 0) {
+               char *p = line;
+
+               /* 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';
-       close(io.fd);
-       return strdup(desc);
-err_out:
+       free(line);
        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++] = '/';