From bba566504901b2c07885ecf325829875a96381a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81kos=20Uzonyi?= Date: Tue, 30 Jun 2020 17:20:12 +0200 Subject: [PATCH 136/138] Use get_proc_pid for /proc paths * mmap_cache.c (mmap_cache_rebuild_if_invalid): Use proc pid instead of tcp->pid for /proc path. * util.c (getfdproto): Likewise. (pidfd_get_pid): Likewise. * pathtrace.c (getfdpath_pid): Likewise. * strace.c (attach_tcb): Likewise. --- mmap_cache.c | 2 +- pathtrace.c | 7 ++++++- strace.c | 2 +- util.c | 9 +++++++-- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mmap_cache.c b/mmap_cache.c index 89c6225..9825df2 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -84,7 +84,7 @@ mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller) return MMAP_CACHE_REBUILD_READY; char filename[sizeof("/proc/4294967296/maps")]; - xsprintf(filename, "/proc/%u/maps", tcp->pid); + xsprintf(filename, "/proc/%u/maps", get_proc_pid(tcp)); FILE *fp = fopen_stream(filename, "r"); if (!fp) { diff --git a/pathtrace.c b/pathtrace.c index f85cf14..87dc64b 100644 --- a/pathtrace.c +++ b/pathtrace.c @@ -87,7 +87,12 @@ getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize) if (fd < 0) return -1; - xsprintf(linkpath, "/proc/%u/fd/%u", pid, fd); + int proc_pid = 0; + translate_pid(NULL, pid, PT_TID, &proc_pid); + if (!proc_pid) + return -1; + + xsprintf(linkpath, "/proc/%u/fd/%u", proc_pid, fd); n = readlink(linkpath, buf, bufsize - 1); /* * NB: if buf is too small, readlink doesn't fail, diff --git a/strace.c b/strace.c index 249533e..ef23f08 100644 --- a/strace.c +++ b/strace.c @@ -1196,7 +1196,7 @@ attach_tcb(struct tcb *const tcp) unsigned int ntid = 0, nerr = 0; if (followfork && tcp->pid != strace_child && - xsprintf(procdir, task_path, tcp->pid) > 0 && + xsprintf(procdir, task_path, get_proc_pid(tcp)) > 0 && (dir = opendir(procdir)) != NULL) { struct_dirent *de; diff --git a/util.c b/util.c index 2568021..481144b 100644 --- a/util.c +++ b/util.c @@ -501,7 +501,7 @@ getfdproto(struct tcb *tcp, int fd) if (fd < 0) return SOCK_PROTO_UNKNOWN; - xsprintf(path, "/proc/%u/fd/%u", tcp->pid, fd); + xsprintf(path, "/proc/%u/fd/%u", get_proc_pid(tcp), fd); r = getxattr(path, "system.sockprotoname", buf, bufsize - 1); if (r <= 0) return SOCK_PROTO_UNKNOWN; @@ -582,8 +582,13 @@ printdev(struct tcb *tcp, int fd, const char *path) pid_t pidfd_get_pid(pid_t pid_of_fd, int fd) { + int proc_pid = 0; + translate_pid(NULL, pid_of_fd, PT_TID, &proc_pid); + if (!proc_pid) + return -1; + char fdi_path[sizeof("/proc/%u/fdinfo/%u") + 2 * sizeof(int) * 3]; - xsprintf(fdi_path, "/proc/%u/fdinfo/%u", pid_of_fd, fd); + xsprintf(fdi_path, "/proc/%u/fdinfo/%u", proc_pid, fd); FILE *f = fopen_stream(fdi_path, "r"); if (!f) -- 2.1.4