1 |
commit: f5acc66db7d1a0bfad6a40eefc0240b80f52df94 |
2 |
Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com> |
3 |
AuthorDate: Tue Oct 24 15:37:01 2017 +0000 |
4 |
Commit: William Hubbs <williamh <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue Oct 24 15:37:37 2017 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/openrc.git/commit/?id=f5acc66d |
7 |
|
8 |
rc_find_pids: ignore pids that are not in our pid namespace |
9 |
|
10 |
X-Gentoo-Bug: 634634 |
11 |
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=634634 |
12 |
|
13 |
src/librc/librc-daemon.c | 19 +++++++++++++++++++ |
14 |
1 file changed, 19 insertions(+) |
15 |
|
16 |
diff --git a/src/librc/librc-daemon.c b/src/librc/librc-daemon.c |
17 |
index 56aaa91b..916cc142 100644 |
18 |
--- a/src/librc/librc-daemon.c |
19 |
+++ b/src/librc/librc-daemon.c |
20 |
@@ -80,9 +80,12 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid) |
21 |
DIR *procdir; |
22 |
struct dirent *entry; |
23 |
FILE *fp; |
24 |
+ int rc; |
25 |
bool container_pid = false; |
26 |
bool openvz_host = false; |
27 |
char *line = NULL; |
28 |
+ char my_ns[30]; |
29 |
+ char proc_ns[30]; |
30 |
size_t len = 0; |
31 |
pid_t p; |
32 |
char buffer[PATH_MAX]; |
33 |
@@ -131,6 +134,14 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid) |
34 |
} |
35 |
} |
36 |
|
37 |
+ memset(my_ns, 0, sizeof(my_ns)); |
38 |
+ memset(proc_ns, 0, sizeof(proc_ns)); |
39 |
+ if (exists("/proc/self/ns/pid")) { |
40 |
+ rc = readlink("/proc/self/ns/pid", my_ns, sizeof(my_ns)); |
41 |
+ if (rc <= 0) |
42 |
+ my_ns[0] = '\0'; |
43 |
+ } |
44 |
+ |
45 |
while ((entry = readdir(procdir)) != NULL) { |
46 |
if (sscanf(entry->d_name, "%d", &p) != 1) |
47 |
continue; |
48 |
@@ -138,6 +149,14 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid) |
49 |
continue; |
50 |
if (pid != 0 && pid != p) |
51 |
continue; |
52 |
+ snprintf(buffer, sizeof(buffer), "/proc/%d/ns/pid", p); |
53 |
+ if (exists(buffer)) { |
54 |
+ rc = readlink(buffer, proc_ns, sizeof(proc_ns)); |
55 |
+ if (rc <= 0) |
56 |
+ proc_ns[0] = '\0'; |
57 |
+ } |
58 |
+ if (strcmp(my_ns, proc_ns)) |
59 |
+ continue; |
60 |
if (uid) { |
61 |
snprintf(buffer, sizeof(buffer), "/proc/%d", p); |
62 |
if (stat(buffer, &sb) != 0 || sb.st_uid != uid) |