Commit bb25ed38 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

files: close_old_fds before forking children (v2)

A few processes can share one fd table. Each process has own set of
service file descriptors and a process knows nothing about servic fds
of another processes. So if two process share one fd table,
close_old_fds will close servic descriptors of another process.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 3c8bd5cc
...@@ -993,10 +993,13 @@ static int restore_task_with_children(void *_arg) ...@@ -993,10 +993,13 @@ static int restore_task_with_children(void *_arg)
int ret; int ret;
sigset_t blockmask; sigset_t blockmask;
close_safe(&ca->fd);
current = ca->item; current = ca->item;
close_safe(&ca->fd);
ret = close_old_fds(current);
if (ret)
exit(1);
pid = getpid(); pid = getpid();
if (current->pid.virt != pid) { if (current->pid.virt != pid) {
pr_err("Pid %d do not match expected %d\n", pid, current->pid.virt); pr_err("Pid %d do not match expected %d\n", pid, current->pid.virt);
......
...@@ -496,7 +496,7 @@ static int open_fdinfos(int pid, struct list_head *list, int state) ...@@ -496,7 +496,7 @@ static int open_fdinfos(int pid, struct list_head *list, int state)
return ret; return ret;
} }
static int close_old_fds(struct pstree_item *me) int close_old_fds(struct pstree_item *me)
{ {
DIR *dir; DIR *dir;
struct dirent *de; struct dirent *de;
...@@ -531,10 +531,6 @@ int prepare_fds(struct pstree_item *me) ...@@ -531,10 +531,6 @@ int prepare_fds(struct pstree_item *me)
u32 ret; u32 ret;
int state; int state;
ret = close_old_fds(me);
if (ret)
goto err;
pr_info("Opening fdinfo-s\n"); pr_info("Opening fdinfo-s\n");
for (state = 0; state < ARRAY_SIZE(states); state++) { for (state = 0; state < ARRAY_SIZE(states); state++) {
...@@ -560,7 +556,6 @@ int prepare_fds(struct pstree_item *me) ...@@ -560,7 +556,6 @@ int prepare_fds(struct pstree_item *me)
break; break;
} }
err:
tty_fini_fds(); tty_fini_fds();
return ret; return ret;
} }
......
...@@ -94,6 +94,7 @@ extern int get_filemap_fd(int pid, VmaEntry *vma_entry); ...@@ -94,6 +94,7 @@ extern int get_filemap_fd(int pid, VmaEntry *vma_entry);
extern int prepare_fs(int pid); extern int prepare_fs(int pid);
extern int set_fd_flags(int fd, int flags); extern int set_fd_flags(int fd, int flags);
extern int close_old_fds(struct pstree_item *me);
#ifndef AT_EMPTY_PATH #ifndef AT_EMPTY_PATH
#define AT_EMPTY_PATH 0x1000 #define AT_EMPTY_PATH 0x1000
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment