mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 10:16:41 +00:00
files: Sanitize helpers for scattering two-headed files
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
946ab984c1
commit
adac02e8a5
5 changed files with 33 additions and 42 deletions
23
criu/files.c
23
criu/files.c
|
|
@ -885,7 +885,7 @@ static int plant_fd(struct fdinfo_list_entry *fle, int fd)
|
|||
return reopen_fd_as(fle->fe->fd, fd);
|
||||
}
|
||||
|
||||
int recv_fd_from_peer(struct fdinfo_list_entry *fle)
|
||||
static int recv_fd_from_peer(struct fdinfo_list_entry *fle)
|
||||
{
|
||||
struct fdinfo_list_entry *tmp;
|
||||
int fd, ret, tsock;
|
||||
|
|
@ -913,7 +913,7 @@ int recv_fd_from_peer(struct fdinfo_list_entry *fle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle)
|
||||
static int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle)
|
||||
{
|
||||
struct sockaddr_un saddr;
|
||||
int len, sock, ret;
|
||||
|
|
@ -928,6 +928,25 @@ int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle)
|
|||
return set_fds_event(fle->pid);
|
||||
}
|
||||
|
||||
/*
|
||||
* Helpers to scatter file_desc across users for those files, that
|
||||
* create two descriptors from a single system call at once (e.g.
|
||||
* ... or better i.e. -- pipes, socketpairs and ttys)
|
||||
*/
|
||||
int recv_desc_from_peer(struct file_desc *d, int *fd)
|
||||
{
|
||||
struct fdinfo_list_entry *fle;
|
||||
|
||||
fle = file_master(d);
|
||||
*fd = fle->fe->fd;
|
||||
return recv_fd_from_peer(fle);
|
||||
}
|
||||
|
||||
int send_desc_to_peer(int fd, struct file_desc *d)
|
||||
{
|
||||
return send_fd_to_peer(fd, file_master(d));
|
||||
}
|
||||
|
||||
static int send_fd_to_self(int fd, struct fdinfo_list_entry *fle)
|
||||
{
|
||||
int dfd = fle->fe->fd;
|
||||
|
|
|
|||
|
|
@ -148,8 +148,8 @@ extern int file_desc_add(struct file_desc *d, u32 id, struct file_desc_ops *ops)
|
|||
extern struct fdinfo_list_entry *file_master(struct file_desc *d);
|
||||
extern struct file_desc *find_file_desc_raw(int type, u32 id);
|
||||
|
||||
extern int recv_fd_from_peer(struct fdinfo_list_entry *fle);
|
||||
extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle);
|
||||
extern int recv_desc_from_peer(struct file_desc *d, int *fd);
|
||||
extern int send_desc_to_peer(int fd, struct file_desc *d);
|
||||
extern int restore_fown(int fd, FownEntry *fown);
|
||||
extern int rst_file_params(int fd, FownEntry *fown, int flags);
|
||||
|
||||
|
|
|
|||
19
criu/pipes.c
19
criu/pipes.c
|
|
@ -229,21 +229,14 @@ static int reopen_pipe(int fd, int flags)
|
|||
|
||||
static int recv_pipe_fd(struct pipe_info *pi, int *new_fd)
|
||||
{
|
||||
struct fdinfo_list_entry *fle;
|
||||
int tmp, fd, ret;
|
||||
|
||||
fle = file_master(&pi->d);
|
||||
fd = fle->fe->fd;
|
||||
|
||||
pr_info("\tWaiting fd for %d\n", fd);
|
||||
|
||||
ret = recv_fd_from_peer(fle);
|
||||
ret = recv_desc_from_peer(&pi->d, &tmp);
|
||||
if (ret != 0) {
|
||||
if (ret != 1)
|
||||
pr_err("Can't get fd %d\n", fd);
|
||||
pr_err("Can't get fd %d\n", tmp);
|
||||
return ret;
|
||||
}
|
||||
tmp = fd;
|
||||
|
||||
if (pi->reopen)
|
||||
fd = reopen_pipe(tmp, pi->pe->flags);
|
||||
|
|
@ -304,13 +297,9 @@ int open_pipe(struct file_desc *d, int *new_fd)
|
|||
return -1;
|
||||
|
||||
list_for_each_entry(p, &pi->pipe_list, pipe_list) {
|
||||
struct fdinfo_list_entry *fle;
|
||||
int fd;
|
||||
int fd = pfd[p->pe->flags & O_WRONLY];
|
||||
|
||||
fle = file_master(&p->d);
|
||||
fd = pfd[p->pe->flags & O_WRONLY];
|
||||
|
||||
if (send_fd_to_peer(fd, fle)) {
|
||||
if (send_desc_to_peer(fd, &p->d)) {
|
||||
pr_perror("Can't send file descriptor");
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1085,7 +1085,6 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui, int *new_fd)
|
|||
{
|
||||
int sk[2];
|
||||
struct unix_sk_info *peer = ui->peer;
|
||||
struct fdinfo_list_entry *fle;
|
||||
|
||||
pr_info("Opening pair master (id %#x ino %#x peer %#x)\n",
|
||||
ui->ue->id, ui->ue->ino, ui->ue->peer);
|
||||
|
|
@ -1106,8 +1105,7 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui, int *new_fd)
|
|||
if (restore_sk_common(sk[0], ui))
|
||||
return -1;
|
||||
|
||||
fle = file_master(&peer->d);
|
||||
if (send_fd_to_peer(sk[1], fle)) {
|
||||
if (send_desc_to_peer(sk[1], &peer->d)) {
|
||||
pr_err("Can't send pair slave\n");
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -1120,21 +1118,14 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui, int *new_fd)
|
|||
|
||||
static int open_unixsk_pair_slave(struct unix_sk_info *ui, int *new_fd)
|
||||
{
|
||||
struct fdinfo_list_entry *fle;
|
||||
int sk, ret;
|
||||
|
||||
fle = file_master(&ui->d);
|
||||
|
||||
pr_info("Opening pair slave (id %#x ino %#x peer %#x) on %d\n",
|
||||
ui->ue->id, ui->ue->ino, ui->ue->peer, fle->fe->fd);
|
||||
|
||||
ret = recv_fd_from_peer(fle);
|
||||
ret = recv_desc_from_peer(&ui->d, &sk);
|
||||
if (ret != 0) {
|
||||
if (ret != 1)
|
||||
pr_err("Can't recv pair slave\n");
|
||||
return ret;
|
||||
}
|
||||
sk = fle->fe->fd;
|
||||
|
||||
if (bind_unix_sk(sk, ui))
|
||||
return -1;
|
||||
|
|
|
|||
16
criu/tty.c
16
criu/tty.c
|
|
@ -893,7 +893,6 @@ static void pty_restore_queued_data(struct tty_info *info, int fd)
|
|||
static int pty_open_slaves(struct tty_info *info)
|
||||
{
|
||||
int fd = -1, ret = -1;
|
||||
struct fdinfo_list_entry *fle;
|
||||
struct tty_info *slave;
|
||||
|
||||
list_for_each_entry(slave, &info->sibling, sibling) {
|
||||
|
|
@ -908,12 +907,10 @@ static int pty_open_slaves(struct tty_info *info)
|
|||
if (restore_tty_params(fd, slave))
|
||||
goto err;
|
||||
|
||||
fle = file_master(&slave->d);
|
||||
pr_debug("send slave %#x fd %d connected on %s\n",
|
||||
slave->tfe->id, fd, path_from_reg(slave->reg_d));
|
||||
|
||||
pr_debug("send slave %#x fd %d connected on %s (pid %d)\n",
|
||||
slave->tfe->id, fd, path_from_reg(slave->reg_d), fle->pid);
|
||||
|
||||
if (send_fd_to_peer(fd, fle)) {
|
||||
if (send_desc_to_peer(fd, &slave->d)) {
|
||||
pr_err("Can't send file descriptor\n");
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -931,14 +928,9 @@ err:
|
|||
|
||||
static int receive_tty(struct tty_info *info, int *new_fd)
|
||||
{
|
||||
struct fdinfo_list_entry *fle;
|
||||
int fd, ret;
|
||||
|
||||
fle = file_master(&info->d);
|
||||
pr_info("\tWaiting tty fd %d (pid %d)\n", fle->fe->fd, fle->pid);
|
||||
|
||||
fd = fle->fe->fd;
|
||||
ret = recv_fd_from_peer(fle);
|
||||
ret = recv_desc_from_peer(&info->d, &fd);
|
||||
if (ret != 0) {
|
||||
if (ret != 1)
|
||||
pr_err("Can't get fd %d\n", fd);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue