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: 5ce42b5de4
("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>
This commit is contained in:
parent
129f70bd60
commit
478272d1cd
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue