Commit 478272d1 authored by Ian Rogers's avatar Ian Rogers Committed by Namhyung Kim
Browse files

tools subcmd: Tighten the filename size in check_if_command_finished



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: 5ce42b5d ("tools subcmd: Add non-waitpid check_if_command_finished()")
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250717150855.1032526-1-irogers@google.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent 129f70bd
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -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. */