summaryrefslogtreecommitdiffstats
path: root/src/coredump/coredump.c
diff options
context:
space:
mode:
authorNick Rosbrook <enr0n@ubuntu.com>2023-09-08 23:03:56 +0200
committerNick Rosbrook <enr0n@ubuntu.com>2023-10-13 21:13:11 +0200
commitade39d9ab849a6e8ae0f182a09e33b670463169c (patch)
treeb3c4d636d19bb3c3b3ef0cf48b6d845092cfd9a8 /src/coredump/coredump.c
parentcoredump: store crashing process UID and GID in Context (diff)
downloadsystemd-ade39d9ab849a6e8ae0f182a09e33b670463169c.tar.xz
systemd-ade39d9ab849a6e8ae0f182a09e33b670463169c.zip
process-util: introduce namespace_get_leader helper
For a given PID and namespace type, this helper function gives the PID of the leader of the namespace containing the given PID. Use this in systemd-coredump instead of using the existing get_mount_namespace_leader. This helper will be used again in a later commit.
Diffstat (limited to 'src/coredump/coredump.c')
-rw-r--r--src/coredump/coredump.c52
1 files changed, 1 insertions, 51 deletions
diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c
index 3a82a71742..e9b1f64e4f 100644
--- a/src/coredump/coredump.c
+++ b/src/coredump/coredump.c
@@ -713,56 +713,6 @@ static int compose_open_fds(pid_t pid, char **ret) {
return memstream_finalize(&m, ret, NULL);
}
-static int get_process_ns(pid_t pid, const char *namespace, ino_t *ns) {
- const char *p;
- struct stat stbuf;
- _cleanup_close_ int proc_ns_dir_fd = -EBADF;
-
- p = procfs_file_alloca(pid, "ns");
-
- proc_ns_dir_fd = open(p, O_DIRECTORY | O_CLOEXEC | O_RDONLY);
- if (proc_ns_dir_fd < 0)
- return -errno;
-
- if (fstatat(proc_ns_dir_fd, namespace, &stbuf, /* flags */0) < 0)
- return -errno;
-
- *ns = stbuf.st_ino;
- return 0;
-}
-
-static int get_mount_namespace_leader(pid_t pid, pid_t *ret) {
- ino_t proc_mntns;
- int r;
-
- r = get_process_ns(pid, "mnt", &proc_mntns);
- if (r < 0)
- return r;
-
- for (;;) {
- ino_t parent_mntns;
- pid_t ppid;
-
- r = get_process_ppid(pid, &ppid);
- if (r == -EADDRNOTAVAIL) /* Reached the top (i.e. typically PID 1, but could also be a process
- * whose parent is not in our pidns) */
- return -ENOENT;
- if (r < 0)
- return r;
-
- r = get_process_ns(ppid, "mnt", &parent_mntns);
- if (r < 0)
- return r;
-
- if (proc_mntns != parent_mntns) {
- *ret = ppid;
- return 0;
- }
-
- pid = ppid;
- }
-}
-
/* Returns 1 if the parent was found.
* Returns 0 if there is not a process we can call the pid's
* container parent (the pid's process isn't 'containerized').
@@ -788,7 +738,7 @@ static int get_process_container_parent_cmdline(pid_t pid, char** cmdline) {
return 0;
}
- r = get_mount_namespace_leader(pid, &container_pid);
+ r = namespace_get_leader(pid, NAMESPACE_MOUNT, &container_pid);
if (r < 0)
return r;