1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

process-util: make sure we don't report ppid == 0

Previously, if pid == 0 and we're PID 1, get_process_ppid()
would set ret to getppid(), i.e. 0, which is inconsistent
when pid is explicitly set to 1. Ensure we always handle
such case by returning -EADDRNOTAVAIL.
This commit is contained in:
Mike Yuan 2024-11-28 00:40:11 +01:00
parent 07612aab66
commit 61263e1436
No known key found for this signature in database
GPG Key ID: 417471C0A40F58B3

View File

@ -702,15 +702,17 @@ int get_process_ppid(pid_t pid, pid_t *ret) {
assert(pid >= 0);
if (pid == 0 || pid == getpid_cached()) {
if (pid == 0)
pid = getpid_cached();
if (pid == 1) /* PID 1 has no parent, shortcut this case */
return -EADDRNOTAVAIL;
if (pid == getpid_cached()) {
if (ret)
*ret = getppid();
return 0;
}
if (pid == 1) /* PID 1 has no parent, shortcut this case */
return -EADDRNOTAVAIL;
p = procfs_file_alloca(pid, "stat");
r = read_one_line_file(p, &line);
if (r == -ENOENT)
@ -724,7 +726,6 @@ int get_process_ppid(pid_t pid, pid_t *ret) {
p = strrchr(line, ')');
if (!p)
return -EIO;
p++;
if (sscanf(p, " "
@ -733,9 +734,9 @@ int get_process_ppid(pid_t pid, pid_t *ret) {
&ppid) != 1)
return -EIO;
/* If ppid is zero the process has no parent. Which might be the case for PID 1 but also for
* processes originating in other namespaces that are inserted into a pidns. Return a recognizable
* error in this case. */
/* If ppid is zero the process has no parent. Which might be the case for PID 1 (caught above)
* but also for processes originating in other namespaces that are inserted into a pidns.
* Return a recognizable error in this case. */
if (ppid == 0)
return -EADDRNOTAVAIL;