2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-31 06:15:24 +00:00

proc: Don't use parent proc_self_fd cached descriptor

When we call open_proc(PROC_SELF, ...) the /proc/self descriptor is
cached in criu. If the process fork()-s after than and child goes
open_proc(PROC_SELF, ...) then it will get the parent's proc descriptor.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Acked-by: Andrew Vagin <avagin@virtuozzo.com>
This commit is contained in:
Pavel Emelyanov
2015-05-29 16:03:00 +03:00
parent c9c41ddfa9
commit 2e8ddb2db0

10
util.c
View File

@@ -174,6 +174,7 @@ int move_img_fd(int *img_fd, int want_fd)
static pid_t open_proc_pid = PROC_NONE;
static int open_proc_fd = -1;
static pid_t open_proc_self_pid;
static int open_proc_self_fd = -1;
static inline void set_proc_self_fd(int fd)
@@ -182,6 +183,7 @@ static inline void set_proc_self_fd(int fd)
close(open_proc_self_fd);
open_proc_self_fd = fd;
open_proc_self_pid = getpid();
}
static inline void set_proc_pid_fd(int pid, int fd)
@@ -195,9 +197,13 @@ static inline void set_proc_pid_fd(int pid, int fd)
static inline int get_proc_fd(int pid)
{
if (pid == PROC_SELF)
if (pid == PROC_SELF) {
if (open_proc_self_fd != -1 && open_proc_self_pid != getpid()) {
close(open_proc_self_fd);
open_proc_self_fd = -1;
}
return open_proc_self_fd;
else if (pid == open_proc_pid)
} else if (pid == open_proc_pid)
return open_proc_fd;
else
return -1;