[CRIU] [PATCH v5 15/19] epoll: Exit with error if tfd is missing
Cyrill Gorcunov
gorcunov at gmail.com
Wed Jul 4 18:51:43 MSK 2018
If we can't find target file descriptor we should
exit on dump with error instead of skipping it.
Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
criu/eventpoll.c | 21 +++++----------------
1 file changed, 5 insertions(+), 16 deletions(-)
diff --git a/criu/eventpoll.c b/criu/eventpoll.c
index 6247b955eabf..3dcc731ba86a 100644
--- a/criu/eventpoll.c
+++ b/criu/eventpoll.c
@@ -129,9 +129,8 @@ static int dump_one_eventpoll(int lfd, u32 id, const struct fd_parms *p)
{
FileEntry fe = FILE_ENTRY__INIT;
EventpollFileEntry e = EVENTPOLL_FILE_ENTRY__INIT;
- EventpollTfdEntry **tfd_cpy = NULL;
- ssize_t i, j, n_tfd_cpy;
uint32_t *toff = NULL;
+ ssize_t i, j;
int ret = -1;
e.id = id;
@@ -145,11 +144,6 @@ static int dump_one_eventpoll(int lfd, u32 id, const struct fd_parms *p)
fe.id = e.id;
fe.epfd = &e;
- n_tfd_cpy = e.n_tfd;
- tfd_cpy = xmemdup(e.tfd, sizeof(e.tfd[0]) * e.n_tfd);
- if (!tfd_cpy)
- goto out;
-
/*
* In regular case there is no so many dup'ed
* descriptors so instead of complex mappings
@@ -178,17 +172,16 @@ static int dump_one_eventpoll(int lfd, u32 id, const struct fd_parms *p)
* pid's file set.
*/
if (p->dfds) {
- for (i = j = 0; i < e.n_tfd; i++) {
+ for (i = 0; i < e.n_tfd; i++) {
int tfd = find_tfd(p->pid, p->fd, p->dfds->fds,
p->dfds->nr_fds, e.tfd[i]->tfd, toff[i]);
if (tfd == -1) {
- pr_warn("Escaped/closed fd descriptor %d on pid %d, ignoring\n",
+ pr_err("Escaped/closed fd descriptor %d on pid %d\n",
e.tfd[i]->tfd, p->pid);
- continue;
+ goto out;
}
- e.tfd[j++]->tfd = tfd;
+ e.tfd[i]->tfd = tfd;
}
- e.n_tfd = j; /* New amount of "valid" fds */
} else
pr_warn_once("Unix SCM files are not verified\n");
@@ -199,13 +192,9 @@ static int dump_one_eventpoll(int lfd, u32 id, const struct fd_parms *p)
pr_info_eventpoll_tfd("Dumping: ", e.id, e.tfd[i]);
}
- /* Restore former values to free resources */
- memcpy(e.tfd, tfd_cpy, sizeof(e.tfd[0]) * n_tfd_cpy);
- e.n_tfd = n_tfd_cpy;
out:
for (i = 0; i < e.n_tfd; i++)
eventpoll_tfd_entry__free_unpacked(e.tfd[i], NULL);
- xfree(tfd_cpy);
xfree(e.tfd);
xfree(toff);
--
2.14.4
More information about the CRIU
mailing list