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) {