From 10c6810bffb6f0107b9a436327524f8379f75cec Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Mon, 21 Dec 2020 22:29:18 +0100 Subject: [PATCH 1/2] Avoid NULL dereference on zombie processes Fixes #361 --- linux/LinuxProcess.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 18679ff7..073cd649 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -368,6 +368,13 @@ void LinuxProcess_makeCommandStr(Process* this) { char *str = strStart; int cmdlineBasenameOffset = lp->procCmdlineBasenameOffset; + int cmdlineBasenameEnd = lp->procCmdlineBasenameEnd; + + if (!cmdline) { + cmdlineBasenameOffset = 0; + cmdlineBasenameEnd = 0; + cmdline = "(zombie)"; + } if (!showMergedCommand || !procExe || !procComm) { /* fall back to cmdline */ if (showMergedCommand && !procExe && procComm && strlen(procComm)) { /* Prefix column with comm */ @@ -385,11 +392,11 @@ void LinuxProcess_makeCommandStr(Process* this) { if (showProgramPath) { (void) stpcpyWithNewlineConversion(str, cmdline); mc->baseStart = cmdlineBasenameOffset; - mc->baseEnd = lp->procCmdlineBasenameEnd; + mc->baseEnd = cmdlineBasenameEnd; } else { (void) stpcpyWithNewlineConversion(str, cmdline + cmdlineBasenameOffset); mc->baseStart = 0; - mc->baseEnd = lp->procCmdlineBasenameEnd - cmdlineBasenameOffset; + mc->baseEnd = cmdlineBasenameEnd - cmdlineBasenameOffset; } if (mc->sep1) { From 6502b026664a8a53fceff16f52981b43fe73cd2b Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Mon, 21 Dec 2020 22:35:38 +0100 Subject: [PATCH 2/2] DiD: Ensure string offsets are inside string boundaries --- linux/LinuxProcess.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 073cd649..802e7225 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -376,6 +376,9 @@ void LinuxProcess_makeCommandStr(Process* this) { cmdline = "(zombie)"; } + assert(cmdlineBasenameOffset >= 0); + assert(cmdlineBasenameOffset <= strlen(cmdline)); + if (!showMergedCommand || !procExe || !procComm) { /* fall back to cmdline */ if (showMergedCommand && !procExe && procComm && strlen(procComm)) { /* Prefix column with comm */ if (strncmp(cmdline + cmdlineBasenameOffset, procComm, MINIMUM(TASK_COMM_LEN - 1, strlen(procComm))) != 0) { @@ -411,6 +414,9 @@ void LinuxProcess_makeCommandStr(Process* this) { int exeBasenameOffset = lp->procExeBasenameOffset; int exeBasenameLen = exeLen - exeBasenameOffset; + assert(exeBasenameOffset >= 0); + assert(exeBasenameOffset <= strlen(procExe)); + /* Start with copying exe */ if (showProgramPath) { str = stpcpy(str, procExe);