[CRIU] [PATCH] Fixed negative returns issues introduced by remote images code.

rbruno at gsd.inesc-id.pt rbruno at gsd.inesc-id.pt
Tue Feb 28 19:32:50 PST 2017


Hi Andrei,

here goes a patch to fix the negative returns issue.

Let me know if you prefer to receive this in another format. If you see
any problem with the resolution of the problem, let me know.

---
 criu/fdstore.c          |  5 +++++
 criu/files-reg.c        |  6 +++++-
 criu/image.c            | 11 +++++++++--
 criu/img-remote-proto.c |  2 +-
 criu/img-remote.c       |  5 +++++
 5 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/criu/fdstore.c b/criu/fdstore.c
index d9bed4d..bddd2ab 100644
--- a/criu/fdstore.c
+++ b/criu/fdstore.c
@@ -100,6 +100,11 @@ int fdstore_get(int id)
 	int sk = get_service_fd(FDSTORE_SK_OFF);
 	int fd;

+	if (sk < 0) {
+		pr_err("Unable get service fd");
+		return -1;
+	}
+
 	mutex_lock(&desc->lock);
 	if (setsockopt(sk, SOL_SOCKET, SO_PEEK_OFF, &id, sizeof(id))) {
 		mutex_unlock(&desc->lock);
diff --git a/criu/files-reg.c b/criu/files-reg.c
index 3b93bb9..bc2c330 100644
--- a/criu/files-reg.c
+++ b/criu/files-reg.c
@@ -134,7 +134,11 @@ static int mkreg_ghost(char *path, u32 mode, struct
ghost_file *gf, struct cr_im
 	if (gfd < 0)
 		return -1;

-	ret = copy_file(img_raw_fd(img), gfd, 0);
+	int rfd = img_raw_fd(img);
+	if (rfd < 0)
+		return -1;
+
+	ret = copy_file(rfd, gfd, 0);
 	if (ret < 0)
 		unlink(path);
 	close(gfd);
diff --git a/criu/image.c b/criu/image.c
index 57d3c7b..7bf52d9 100644
--- a/criu/image.c
+++ b/criu/image.c
@@ -333,8 +333,15 @@ int do_open_remote_image(int dfd, char *path, int flags)
 	 * change to previous working dir and back to correctly open the image
 	 * proxy and cache sockets. */
 	int save = dirfd(opendir("."));
-	if (fchdir(get_service_fd(IMG_FD_OFF)) < 0) {
-		pr_debug("fchdir to dfd failed!\n");
+	int service_fd = get_service_fd(IMG_FD_OFF);
+
+	if (service_fd < 0) {
+		pr_err("Unable to get service fd.\n");
+		return -1;
+	}
+
+	if (fchdir(service_fd) < 0) {
+		pr_perror("fchdir to dfd failed");
 		return -1;
 	}

diff --git a/criu/img-remote-proto.c b/criu/img-remote-proto.c
index c05b921..34074f2 100644
--- a/criu/img-remote-proto.c
+++ b/criu/img-remote-proto.c
@@ -593,7 +593,6 @@ void *accept_local_image_connections(void *port)
 		if (cli_fd < 0) {
 			if (!finished)
 				pr_err("Unable to accept local image connection");
-			close(cli_fd);
 			return NULL;
 		}

@@ -624,6 +623,7 @@ void *accept_local_image_connections(void *port)
 		int fd = open_proc_rw(PROC_GEN, LAST_PID_PATH);
 		if (fd < 0) {
 			pr_perror("Can't open %s", LAST_PID_PATH);
+			return NULL;
 		}

 		if (flock(fd, LOCK_EX)) {
diff --git a/criu/img-remote.c b/criu/img-remote.c
index 337cb4a..7dbde0e 100644
--- a/criu/img-remote.c
+++ b/criu/img-remote.c
@@ -127,6 +127,11 @@ int skip_remote_bytes(int fd, unsigned long len)
 	int n = 0;
 	unsigned long curr = 0;

+	if (fd < 0) {
+		pr_perror("Invalid fd: %d", fd);
+		return -1;
+	}
+
 	for (; curr < len; ) {
 		n = read(fd, buf, min(len - curr, (unsigned long)4096));
 		if (n == 0) {
-- 
1.9.1





More information about the CRIU mailing list