]> git.baikalelectronics.ru Git - kernel.git/commitdiff
perf test: Avoid shell test description infinite loop
authorIan Rogers <irogers@google.com>
Tue, 17 May 2022 20:41:44 +0000 (13:41 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 21 May 2022 17:45:19 +0000 (14:45 -0300)
for_each_shell_test() is already strict in expecting tests to be files
and executable. It is sometimes possible when it iterates over all files
that it finds one that is executable and lacks a newline character. When
this happens the loop never terminates as it doesn't check for EOF.

Add the EOF check to make this loop at least bounded by the file size.

If the description is returned as NULL then also skip the test.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Marco Elver <elver@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Sohaib Mohamed <sohaib.amhmd@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20220517204144.645913-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/builtin-test.c

index fac3717d9ba1bb9902fd2372477b175aa4646bea..d336cda94a115fdbdeb15fd71437755dcb75a59b 100644 (file)
@@ -279,6 +279,7 @@ static const char *shell_test__description(char *description, size_t size,
 {
        FILE *fp;
        char filename[PATH_MAX];
+       int ch;
 
        path__join(filename, sizeof(filename), path, name);
        fp = fopen(filename, "r");
@@ -286,7 +287,9 @@ static const char *shell_test__description(char *description, size_t size,
                return NULL;
 
        /* Skip shebang */
-       while (fgetc(fp) != '\n');
+       do {
+               ch = fgetc(fp);
+       } while (ch != EOF && ch != '\n');
 
        description = fgets(description, size, fp);
        fclose(fp);
@@ -417,7 +420,8 @@ static int run_shell_tests(int argc, const char *argv[], int i, int width,
                        .priv = &st,
                };
 
-               if (!perf_test__matches(test_suite.desc, curr, argc, argv))
+               if (test_suite.desc == NULL ||
+                   !perf_test__matches(test_suite.desc, curr, argc, argv))
                        continue;
 
                st.file = ent->d_name;