[PATCH v2 6/7] Use get_proc_pid for /proc paths

Ákos Uzonyi uzonyi.akos at gmail.com
Tue Jul 21 21:19:24 UTC 2020


* defs.h (get_proc_pid): New function definition.
* 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.
---
 defs.h       | 2 +-
 mmap_cache.c | 2 +-
 pathtrace.c  | 5 ++++-
 strace.c     | 2 +-
 util.c       | 7 +++++--
 5 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/defs.h b/defs.h
index 2a583906..ff3320c0 100644
--- a/defs.h
+++ b/defs.h
@@ -1002,7 +1002,7 @@ extern kernel_ulong_t *
 fetch_indirect_syscall_args(struct tcb *, kernel_ulong_t addr, unsigned int n_args);
 
 extern void pidns_init(void);
-
+extern int get_proc_pid(struct tcb *tcp);
 extern int translate_pid(struct tcb *tcp, int dest_id, enum pid_type type,
 		    int *proc_pid_ptr);
 
diff --git a/mmap_cache.c b/mmap_cache.c
index 89c62254..9825df26 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 5b60762b..8011ca4e 100644
--- a/pathtrace.c
+++ b/pathtrace.c
@@ -87,7 +87,10 @@ 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_TGID, &proc_pid);
+
+	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 249533ea..ef23f08f 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 094e5818..4238d8ab 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,11 @@ 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_TGID, &proc_pid);
+
 	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.27.0



More information about the Strace-devel mailing list