]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tools subcmd: Tighten the filename size in check_if_command_finished
authorIan Rogers <irogers@google.com>
Thu, 17 Jul 2025 15:08:53 +0000 (08:08 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 23 Jul 2025 01:17:53 +0000 (18:17 -0700)
FILENAME_MAX is often PATH_MAX (4kb), far more than needed for the
/proc path. Make the buffer size sufficient for the maximum integer
plus "/proc/" and "/status" with a '\0' terminator.

Fixes: 5ce42b5de461 ("tools subcmd: Add non-waitpid check_if_command_finished()")
Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250717150855.1032526-1-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/lib/subcmd/run-command.c

index 0a764c25c384f0b2a7d074ef146477c199a845d4..b7510f83209a0acde3a5d64d1556ce1558c17d70 100644 (file)
@@ -5,6 +5,7 @@
 #include <ctype.h>
 #include <fcntl.h>
 #include <string.h>
+#include <linux/compiler.h>
 #include <linux/string.h>
 #include <errno.h>
 #include <sys/wait.h>
@@ -216,10 +217,20 @@ static int wait_or_whine(struct child_process *cmd, bool block)
        return result;
 }
 
+/*
+ * Conservative estimate of number of characaters needed to hold an a decoded
+ * integer, assume each 3 bits needs a character byte and plus a possible sign
+ * character.
+ */
+#ifndef is_signed_type
+#define is_signed_type(type) (((type)(-1)) < (type)1)
+#endif
+#define MAX_STRLEN_TYPE(type) (sizeof(type) * 8 / 3 + (is_signed_type(type) ? 1 : 0))
+
 int check_if_command_finished(struct child_process *cmd)
 {
 #ifdef __linux__
-       char filename[FILENAME_MAX + 12];
+       char filename[6 + MAX_STRLEN_TYPE(typeof(cmd->pid)) + 7 + 1];
        char status_line[256];
        FILE *status_file;
 
@@ -227,7 +238,7 @@ int check_if_command_finished(struct child_process *cmd)
         * Check by reading /proc/<pid>/status as calling waitpid causes
         * stdout/stderr to be closed and data lost.
         */
-       sprintf(filename, "/proc/%d/status", cmd->pid);
+       sprintf(filename, "/proc/%u/status", cmd->pid);
        status_file = fopen(filename, "r");
        if (status_file == NULL) {
                /* Open failed assume finish_command was called. */