diff --git a/processcore/process.h b/processcore/process.h --- a/processcore/process.h +++ b/processcore/process.h @@ -184,6 +184,9 @@ int numThreads() const; ///< Number of threads that this process has, including the main one. 0 if not known void setNumThreads(int number); ///< The number of threads that this process has, including this process. + int noNewPrivileges() const; + void setNoNewPrivileges(int number); ///< Linux process flag NoNewPrivileges + int index() const; ///< Each process has a parent process. Each sibling has a unique number to identify it under that parent. This is that number. void setIndex(int index); diff --git a/processcore/process.cpp b/processcore/process.cpp --- a/processcore/process.cpp +++ b/processcore/process.cpp @@ -82,6 +82,7 @@ int index; Process::Changes changes; int elapsedTimeMilliSeconds; + int noNewPrivileges; }; Process::Process() @@ -291,6 +292,11 @@ return d->startTime; } +int Process::noNewPrivileges() const +{ + return d->noNewPrivileges; +} + int Process::userUsage() const { return d->userUsage; @@ -582,6 +588,12 @@ d->startTime = startTime; } +void Process::setNoNewPrivileges(int number) { + if(d->noNewPrivileges == number) return; + d->noNewPrivileges = number; + d->changes |= Process::Status; +} + void Process::setUserUsage(int _userUsage) { if(d->userUsage == _userUsage) return; d->userUsage = _userUsage; diff --git a/processcore/processes_linux_p.cpp b/processcore/processes_linux_p.cpp --- a/processcore/processes_linux_p.cpp +++ b/processcore/processes_linux_p.cpp @@ -138,6 +138,7 @@ process->setGid(0); process->setTracerpid(-1); process->setNumThreads(0); + process->setNoNewPrivileges(0); int size; int found = 0; //count how many fields we found @@ -147,7 +148,10 @@ if((unsigned int)size > sizeof("Name:") && qstrncmp(mBuffer, "Name:", sizeof("Name:")-1) == 0) { if(process->command().isEmpty()) process->setName(QString::fromLocal8Bit(mBuffer + sizeof("Name:")-1, size-sizeof("Name:")+1).trimmed()); - if(++found == 5) goto finish; + if(++found == 6) goto finish; + } else if((unsigned int)size > sizeof("NoNewPrivs:") && qstrncmp(mBuffer, "NoNewPrivs:", sizeof("NoNewPrivs:")-1) == 0) { + process->setNoNewPrivileges(atol(mBuffer + sizeof("NoNewPrivs:")-1)); + if(++found == 6) goto finish; } break; case 'U': @@ -161,7 +165,7 @@ process->setEuid(euid); process->setSuid(suid); process->setFsuid(fsuid); - if(++found == 5) goto finish; + if(++found == 6) goto finish; } break; case 'G': @@ -172,18 +176,18 @@ process->setEgid(egid); process->setSgid(sgid); process->setFsgid(fsgid); - if(++found == 5) goto finish; + if(++found == 6) goto finish; } break; case 'T': if((unsigned int)size > sizeof("TracerPid:") && qstrncmp(mBuffer, "TracerPid:", sizeof("TracerPid:")-1) == 0) { process->setTracerpid(atol(mBuffer + sizeof("TracerPid:")-1)); if (process->tracerpid() == 0) process->setTracerpid(-1); - if(++found == 5) goto finish; + if(++found == 6) goto finish; } else if((unsigned int)size > sizeof("Threads:") && qstrncmp(mBuffer, "Threads:", sizeof("Threads:")-1) == 0) { process->setNumThreads(atol(mBuffer + sizeof("Threads:")-1)); - if(++found == 5) goto finish; + if(++found == 6) goto finish; } break; default: diff --git a/processui/ProcessModel.h b/processui/ProcessModel.h --- a/processui/ProcessModel.h +++ b/processui/ProcessModel.h @@ -138,7 +138,7 @@ * setup header function, and make sure you increase PROCESSHEADERVERSION. This will ensure * that old saved settings won't be used */ -#define PROCESSHEADERVERSION 6 +#define PROCESSHEADERVERSION 7 enum { HeadingName=0, HeadingUser, HeadingPid, @@ -152,6 +152,7 @@ HeadingMemory, HeadingSharedMemory, HeadingStartTime, + HeadingNoNewPrivileges, HeadingCommand, HeadingXMemory, HeadingXTitle diff --git a/processui/ProcessModel.cpp b/processui/ProcessModel.cpp --- a/processui/ProcessModel.cpp +++ b/processui/ProcessModel.cpp @@ -262,6 +262,8 @@ case HeadingStartTime: { return processLeft->startTime() > processRight->startTime(); } + case HeadingNoNewPrivileges: + return processLeft->noNewPrivileges() > processRight->noNewPrivileges(); case HeadingXMemory: return processLeft->pixmapBytes() > processRight->pixmapBytes(); case HeadingVmSize: @@ -756,6 +758,11 @@ index = q->createIndex(row, ProcessModel::HeadingUser, process); emit q->dataChanged(index, index); } + if(process->changes() & KSysGuard::Process::Status) { + totalUpdated++; + QModelIndex index = q->createIndex(row, ProcessModel::HeadingNoNewPrivileges, process); + emit q->dataChanged(index, index); + } if(process->changes() & KSysGuard::Process::NiceLevels) { totalUpdated++; QModelIndex index = q->createIndex(row, ProcessModel::HeadingNiceness, process); @@ -961,6 +968,7 @@ case HeadingXMemory: case HeadingSharedMemory: case HeadingStartTime: + case HeadingNoNewPrivileges: case HeadingIoRead: case HeadingIoWrite: case HeadingVmSize: @@ -1007,6 +1015,8 @@ return i18n("This is approximately the amount of real physical memory that this process's shared libraries are using.
This memory is shared among all processes that use this library.
"); case HeadingStartTime: return i18n("The elapsed time since the process was started."); + case HeadingNoNewPrivileges: + return i18n("Linux flag NoNewPrivileges, if set the process can't gain further privileges via setuid etc."); case HeadingCommand: return i18n("The command with which this process was launched."); case HeadingXMemory: @@ -1050,6 +1060,8 @@ return i18n("Technical information: This is an approximation of the Shared memory, called SHR in top. It is the number of pages that are backed by a file (see kernel Documentation/filesystems/proc.txt). For an individual process, see \"Detailed Memory Information\" for a more accurate, but slower, calculation of the true Shared memory usage."); case HeadingStartTime: return i18n("Technical information: The underlying value (clock ticks since system boot) is retrieved from /proc/[pid]/stat"); + case HeadingNoNewPrivileges: + return i18n("Technical information: The flag is retrieved from /proc/[pid]/status"); case HeadingCommand: return i18n("Technical information: This is from /proc/*/cmdline"); case HeadingXMemory: @@ -1316,6 +1328,8 @@ const auto relativeStartTime = absoluteStartTime.secsTo(QDateTime::currentDateTime()); return TimeUtil::secondsToHumanElapsedString(relativeStartTime); } + case HeadingNoNewPrivileges: + return QString::number(process->noNewPrivileges()); case HeadingCommand: { return process->command().replace(QLatin1Char('\n'),QLatin1Char(' ')); @@ -1659,6 +1673,7 @@ case HeadingNiceness: case HeadingCPUTime: case HeadingStartTime: + case HeadingNoNewPrivileges: case HeadingPid: case HeadingMemory: case HeadingXMemory: @@ -1720,6 +1735,8 @@ return (qlonglong)(process->vmRSS() - process->vmURSS()); case HeadingStartTime: return process->startTime(); // 2015-01-03, gregormi: can maybe be replaced with something better later + case HeadingNoNewPrivileges: + return process->noNewPrivileges(); case HeadingCommand: return process->command(); case HeadingIoRead: @@ -1942,6 +1959,7 @@ headings << i18nc("process heading", "Memory"); headings << i18nc("process heading", "Shared Mem"); headings << i18nc("process heading", "Relative Start Time"); + headings << i18nc("process heading", "NNP"); headings << i18nc("process heading", "Command"); #if HAVE_X11 if (d->mIsX11) {