chiark / gitweb /
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)
committerSven Eden <yamakuzure@gmx.net>
Fri, 16 Jun 2017 08:12:59 +0000 (10:12 +0200)
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 faadb756cc239c6cc8933680d81134e53d50bc13..bcc5a45d8ebc633e46c6f149bd10fa8018561d16 100644 (file)
@@ -101,6 +101,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;
@@ -127,14 +128,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);