94 lines
2.8 KiB
Diff
94 lines
2.8 KiB
Diff
From bba566504901b2c07885ecf325829875a96381a7 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?=C3=81kos=20Uzonyi?= <uzonyi.akos@gmail.com>
|
|
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
|
|
|