]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util-lib: drop trailing non-printable characters from cmdline (#3512)
authorMax Prokhorov <prokhorov.max@outlook.com>
Mon, 13 Jun 2016 01:13:42 +0000 (04:13 +0300)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 13 Jun 2016 01:13:42 +0000 (21:13 -0400)
If max_length is equal or greater than cmdline length all trailing non-printable
characters are dropped. If max_length is 0 it should do the same.

This should also fix cmdline truncation if the last character is not '\0'.

Fixes #3469.

src/basic/process-util.c

index b991e7c6ba567eb525697566ac8769dabaf4b9b1..f6bde20fc516b7efb6b57ce51abd12df15076550 100644 (file)
@@ -102,6 +102,7 @@ int get_process_comm(pid_t pid, char **name) {
 
 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
         _cleanup_fclose_ FILE *f = NULL;
+        bool space = false;
         char *r = NULL, *k;
         const char *p;
         int c;
@@ -128,14 +129,21 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
                                 return -ENOMEM;
                         }
 
-                        r[len++] = isprint(c) ? c : ' ';
-                }
+                        if (isprint(c)) {
+                                if (space) {
+                                        r[len++] = ' ';
+                                        space = false;
+                                }
+
+                                r[len++] = c;
+                        } else
+                                space = true;
+               }
 
                 if (len > 0)
-                        r[len-1] = 0;
+                        r[len] = 0;
 
         } else {
-                bool space = false;
                 size_t left;
 
                 r = new(char, max_length);