From b1a8f9ca25898baa25f67244b041a5277193d64e Mon Sep 17 00:00:00 2001 From: MarsChan Date: Wed, 23 Sep 2020 10:18:55 +0800 Subject: [PATCH] check sanity of SC_ARG_MAX --- ...ort-pgrep-check-sanity-of-SC_ARG_MAX.patch | 60 +++++++++++++++++++ procps-ng.spec | 11 +++- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 backport-pgrep-check-sanity-of-SC_ARG_MAX.patch diff --git a/backport-pgrep-check-sanity-of-SC_ARG_MAX.patch b/backport-pgrep-check-sanity-of-SC_ARG_MAX.patch new file mode 100644 index 0000000..d94ed1f --- /dev/null +++ b/backport-pgrep-check-sanity-of-SC_ARG_MAX.patch @@ -0,0 +1,60 @@ +From bb96fc42956c9ed926a1b958ab715f8b4a663dec Mon Sep 17 00:00:00 2001 +From: Craig Small +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.22.0.windows.1 + diff --git a/procps-ng.spec b/procps-ng.spec index 0dbdb33..14ea0e9 100644 --- a/procps-ng.spec +++ b/procps-ng.spec @@ -1,6 +1,6 @@ Name: procps-ng Version: 3.3.16 -Release: 11 +Release: 12 Summary: Utilities that provide system information. License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ URL: https://sourceforge.net/projects/procps-ng/ @@ -11,6 +11,7 @@ Source2: README.top Patch9000: feature-add-options-M-and-N-for-top.patch Patch9001: bugfix-top-exit-with-error-when-pid-overflow.patch +Patch9002: backport-pgrep-check-sanity-of-SC_ARG_MAX.patch BuildRequires: ncurses-devel libtool autoconf automake gcc gettext-devel systemd-devel @@ -93,6 +94,14 @@ ln -s %{_bindir}/pidof %{buildroot}%{_sbindir}/pidof %{_mandir}/translated %changelog +* Wed Sep 23 2020 MarsChan - 3.3.16-12 +- Type:bugfix +- ID:NA +- SUG:restart +- DESC: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. + * Tue Jan 7 2020 MarsChan - 3.3.16-11 - Type:upgrade - ID:NA -- Gitee