base-files: stage2: improve /proc/*/stat parser
authorDaniel Golle <daniel@makrotopia.org>
Sat, 13 Nov 2021 16:29:52 +0000 (16:29 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Sat, 13 Nov 2021 18:36:52 +0000 (18:36 +0000)
Simply reading /proc/*/stat as a space-separated string will not work
as the process name may itself contain spaces. Hence we must match on
the '(' and ')' characters around the process name and can then handle
the remaining string as space-separated values.
This fixes shell error messages which have been popping up the console
due to spaces in process names being interpreted as field separators.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
package/base-files/files/lib/upgrade/stage2

index 45fb98d88969890d277b16dda94568b0189e5ac8..74edd61104888fde4d86f42725ef481979d28f74 100755 (executable)
@@ -97,12 +97,15 @@ kill_remaining() { # [ <signal> [ <loop> ] ]
                        [ -f "$stat" ] || continue
 
                        local pid name state ppid rest
-                       read pid name state ppid rest < $stat
-                       name="${name#(}"; name="${name%)}"
+                       read pid rest < $stat
+                       name="${rest#\(}" ; rest="${name##*\) }" ; name="${name%\)*}"
+                       set -- $rest ; state="$1" ; ppid="$2"
 
                        # Skip PID1, our parent, ourself and our children
                        [ $pid -ne 1 -a $pid -ne $proc_ppid -a $pid -ne $$ -a $ppid -ne $$ ] || continue
 
+                       [ -f "/proc/$pid/cmdline" ] || continue
+
                        local cmdline
                        read cmdline < /proc/$pid/cmdline