From 23bf564d73befc4c645bc0bb0290bae4569f33c7 Mon Sep 17 00:00:00 2001 From: "Martin \"eto\" Misuth" Date: Tue, 6 Oct 2015 19:50:19 +0200 Subject: [PATCH] Fixed reparenting issue. PPID should be updated each refresh as any process can get reparented to either PID1 or even any other PID (if there are custom reapers in the system). Similar issue with jails, elevated process can ask kernel to attach itself into any jail at any time, thus JID and jail name can change each refresh cycle. --- freebsd/FreeBSDProcessList.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c index e1954cae..f1b7a191 100644 --- a/freebsd/FreeBSDProcessList.c +++ b/freebsd/FreeBSDProcessList.c @@ -199,6 +199,7 @@ void ProcessList_goThroughEntries(ProcessList* this) { proc->show = ! ((hideKernelThreads && Process_isKernelThread(fp)) || (hideUserlandThreads && Process_isUserlandThread(proc))); + if (!preExisting) { fp->jid = kproc->ki_jid; proc->pid = kproc->ki_pid; @@ -206,7 +207,6 @@ void ProcessList_goThroughEntries(ProcessList* this) { fp->kernel = 1; else fp->kernel = 0; - proc->ppid = kproc->ki_ppid; proc->tpgid = kproc->ki_tpgid; proc->tgid = kproc->ki_pid; proc->session = kproc->ki_sid; @@ -219,12 +219,19 @@ void ProcessList_goThroughEntries(ProcessList* this) { proc->comm = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->basenameOffset); fp->jname = FreeBSDProcessList_readJailName(kproc); } else { + if(fp->jid != kproc->ki_jid) { + fp->jid = kproc->ki_jid; + free(fp->jname); + fp->jname = FreeBSDProcessList_readJailName(kproc); + } if (settings->updateProcessNames) { free(proc->comm); proc->comm = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->basenameOffset); } } + proc->ppid = kproc->ki_ppid; + proc->m_size = kproc->ki_size / pageSizeKb / 1000; proc->m_resident = kproc->ki_rssize; // * pageSizeKb; proc->nlwp = kproc->ki_numthreads;