diff options
-rw-r--r-- | recipes-core/procps/procps/pgrep.patch | 60 | ||||
-rw-r--r-- | recipes-core/procps/procps_%.bbappend | 4 |
2 files changed, 64 insertions, 0 deletions
diff --git a/recipes-core/procps/procps/pgrep.patch b/recipes-core/procps/procps/pgrep.patch new file mode 100644 index 0000000..57a9346 --- /dev/null +++ b/recipes-core/procps/procps/pgrep.patch @@ -0,0 +1,60 @@ +From bb96fc42956c9ed926a1b958ab715f8b4a663dec Mon Sep 17 00:00:00 2001 +From: Craig Small <csmall@dropbear.xyz> +Date: Sun, 5 Jan 2020 15:05:55 +1100 +Subject: [PATCH] pgrep: check sanity of SC_ARG_MAX + +A kernel change means we cannot trust what sysconf(SC_ARG_MAX) +returns. We clamp it so its more than 4096 and less than 128*1024 +which is what findutils does. + +References: + procps-ng/procps#152 + https://git.savannah.gnu.org/cgit/findutils.git/tree/lib/buildcmd.c#n535 + https://lwn.net/Articles/727862/ +--- + pgrep.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +diff --git a/pgrep.c b/pgrep.c +index 01563db..bde7448 100644 +--- a/pgrep.c ++++ b/pgrep.c +@@ -485,6 +485,26 @@ static regex_t * do_regcomp (void) + return preg; + } + ++/* ++ * SC_ARG_MAX used to return the maximum size a command line can be ++ * however changes to the kernel mean this can be bigger than we can ++ * alloc. Clamp it to 128kB like xargs and friends do ++ * Should also not be smaller than POSIX_ARG_MAX which is 4096 ++ */ ++static size_t get_arg_max(void) ++{ ++#define MIN_ARG_SIZE 4096u ++#define MAX_ARG_SIZE (128u * 1024u) ++ ++ size_t val = sysconf(_SC_ARG_MAX); ++ ++ if (val < MIN_ARG_SIZE) ++ val = MIN_ARG_SIZE; ++ if (val > MAX_ARG_SIZE) ++ val = MAX_ARG_SIZE; ++ ++ return val; ++} + static struct el * select_procs (int *num) + { + PROCTAB *ptp; +@@ -497,7 +517,7 @@ static struct el * select_procs (int *num) + regex_t *preg; + pid_t myself = getpid(); + struct el *list = NULL; +- long cmdlen = sysconf(_SC_ARG_MAX) * sizeof(char); ++ long cmdlen = get_arg_max() * sizeof(char); + char *cmdline = xmalloc(cmdlen); + char *cmdsearch = xmalloc(cmdlen); + char *cmdoutput = xmalloc(cmdlen); +-- +2.26.2 + diff --git a/recipes-core/procps/procps_%.bbappend b/recipes-core/procps/procps_%.bbappend new file mode 100644 index 0000000..b08f817 --- /dev/null +++ b/recipes-core/procps/procps_%.bbappend @@ -0,0 +1,4 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI += "file://pgrep.patch \ + " |