pgrep: Use POSIX _SC_ARG_MAX for maximum full command line length

This commit is contained in:
Clay Baenziger 2019-04-28 18:17:42 -04:00 committed by Craig Small
parent c660dbae1b
commit f9e56d3c66

27
pgrep.c
View File

@ -42,8 +42,6 @@
#define EXIT_FATAL 3 #define EXIT_FATAL 3
#define XALLOC_EXIT_CODE EXIT_FATAL #define XALLOC_EXIT_CODE EXIT_FATAL
#define CMDSTRSIZE 4096
#include "c.h" #include "c.h"
#include "fileutils.h" #include "fileutils.h"
#include "nsutils.h" #include "nsutils.h"
@ -499,9 +497,10 @@ static struct el * select_procs (int *num)
regex_t *preg; regex_t *preg;
pid_t myself = getpid(); pid_t myself = getpid();
struct el *list = NULL; struct el *list = NULL;
char cmdline[CMDSTRSIZE] = ""; long cmdlen = sysconf(_SC_ARG_MAX) * sizeof(char);
char cmdsearch[CMDSTRSIZE] = ""; char *cmdline = xmalloc(cmdlen);
char cmdoutput[CMDSTRSIZE] = ""; char *cmdsearch = xmalloc(cmdlen);
char *cmdoutput = xmalloc(cmdlen);
proc_t ns_task; proc_t ns_task;
ptp = do_openproc(); ptp = do_openproc();
@ -563,7 +562,7 @@ static struct el * select_procs (int *num)
if (task.cmdline && (opt_longlong || opt_full) ) { if (task.cmdline && (opt_longlong || opt_full) ) {
int i = 0; int i = 0;
int bytes = sizeof (cmdline); long bytes = cmdlen;
char *str = cmdline; char *str = cmdline;
/* make sure it is always NUL-terminated */ /* make sure it is always NUL-terminated */
@ -586,18 +585,18 @@ static struct el * select_procs (int *num)
if (opt_long || opt_longlong || (match && opt_pattern)) { if (opt_long || opt_longlong || (match && opt_pattern)) {
if (opt_longlong && task.cmdline) if (opt_longlong && task.cmdline)
strncpy (cmdoutput, cmdline, sizeof cmdoutput - 1); strncpy (cmdoutput, cmdline, cmdlen - 1);
else else
strncpy (cmdoutput, task.cmd, sizeof cmdoutput - 1); strncpy (cmdoutput, task.cmd, cmdlen - 1);
cmdoutput[sizeof cmdoutput - 1] = '\0'; cmdoutput[cmdlen - 1] = '\0';
} }
if (match && opt_pattern) { if (match && opt_pattern) {
if (opt_full && task.cmdline) if (opt_full && task.cmdline)
strncpy (cmdsearch, cmdline, sizeof cmdsearch - 1); strncpy (cmdsearch, cmdline, cmdlen - 1);
else else
strncpy (cmdsearch, task.cmd, sizeof cmdsearch - 1); strncpy (cmdsearch, task.cmd, cmdlen - 1);
cmdsearch[sizeof cmdsearch - 1] = '\0'; cmdsearch[cmdlen - 1] = '\0';
if (regexec (preg, cmdsearch, 0, NULL, 0) != 0) if (regexec (preg, cmdsearch, 0, NULL, 0) != 0)
match = 0; match = 0;
@ -661,6 +660,10 @@ static struct el * select_procs (int *num)
closeproc (ptp); closeproc (ptp);
*num = matches; *num = matches;
free(cmdline);
free(cmdsearch);
free(cmdoutput);
return list; return list;
} }