diff options
Diffstat (limited to 'src/Hooks/CCpp.cpp')
| -rw-r--r-- | src/Hooks/CCpp.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/Hooks/CCpp.cpp b/src/Hooks/CCpp.cpp index e6768a6..1c152e6 100644 --- a/src/Hooks/CCpp.cpp +++ b/src/Hooks/CCpp.cpp @@ -54,32 +54,41 @@ static char* get_cmdline(pid_t pid) char path[PATH_MAX]; char cmdline[COMMAND_LINE_SIZE]; snprintf(path, sizeof(path), "/proc/%u/cmdline", (int)pid); - int dst = 0; + int idx = 0; int fd = open(path, O_RDONLY); if (fd >= 0) { int len = read(fd, cmdline, sizeof(cmdline) - 1); - if (len >= 0) + close(fd); + + if (len > 0) { - int src = 0; - while (src < len) + /* In Linux, there is always one trailing NUL byte, + * prevent it from being replaced by space below. + */ + if (cmdline[len - 1] == '\0') + len--; + + while (idx < len) { - char ch = cmdline[src++]; + unsigned char ch = cmdline[idx]; if (ch == '\0') { - cmdline[dst++] = ' '; + cmdline[idx++] = ' '; } - /* TODO: maybe just ch >= ' '? */ - else if (isspace(ch) || (isascii(ch) && !iscntrl(ch))) + else if (ch >= ' ' && ch <= 0x7e) { - cmdline[dst++] = ch; + cmdline[idx++] = ch; + } + else + { + cmdline[idx++] = '?'; } } } - close(fd); } - cmdline[dst] = '\0'; + cmdline[idx] = '\0'; return xstrdup(cmdline); } |
