Fixed negative returns issues introduced by remote images code.

Submitted by Rodrigo Bruno on March 1, 2017, 3:32 a.m.

Details

Message ID be5d037ef2fbb3ca88b3346687d75aea.squirrel@146.193.41.131
State New
Series "Fixed negative returns issues introduced by remote images code."
Headers show

Commit Message

Rodrigo Bruno March 1, 2017, 3:32 a.m.
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(-)

Patch hide | download patch | download mbox

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) {

Comments

Andrey Vagin Feb. 28, 2017, 11:25 p.m.
On Wed, Mar 01, 2017 at 04:32:50AM +0100, rbruno@gsd.inesc-id.pt wrote:
> 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

Applying: Fixed negative returns issues introduced by remote images code.
fatal: corrupt patch at line 30

Looks like the previous two lines was the one line in an original patch.

How do you send patches? I recomend to use git send-email.
https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/

>  	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
> 
> 
> 
> _______________________________________________
> CRIU mailing list
> CRIU@openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
Rodrigo Bruno March 1, 2017, 2:05 p.m.
Hi,

2017-02-28 23:25 GMT+00:00 Andrei Vagin <avagin@virtuozzo.com>:

> On Wed, Mar 01, 2017 at 04:32:50AM +0100, rbruno@gsd.inesc-id.pt wrote:
> > 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
>
> Applying: Fixed negative returns issues introduced by remote images code.
> fatal: corrupt patch at line 30
>
> Looks like the previous two lines was the one line in an original patch.
>
> How do you send patches? I recomend to use git send-email.
> https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/
>
>
Hmm... Which lines are repeated?

I use:
git commit
git format-patch -1 HEAD
(copy to email, send)

However, git send-email seems very cool :-)



> >       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
> >
> >
> >
> > _______________________________________________
> > CRIU mailing list
> > CRIU@openvz.org
> > https://lists.openvz.org/mailman/listinfo/criu
>
Andrey Vagin March 2, 2017, 12:15 a.m.
On Wed, Mar 01, 2017 at 02:05:22PM +0000, Rodrigo Bruno wrote:
> Hi,
> 
> 2017-02-28 23:25 GMT+00:00 Andrei Vagin <avagin@virtuozzo.com>:
> 
>     On Wed, Mar 01, 2017 at 04:32:50AM +0100, rbruno@gsd.inesc-id.pt wrote:
>     > 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
> 
>     Applying: Fixed negative returns issues introduced by remote images code.
>     fatal: corrupt patch at line 30
> 
>     Looks like the previous two lines was the one line in an original patch.
> 
>     How do you send patches? I recomend to use git send-email.
>     https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/
> 
> 
> 
> Hmm... Which lines are repeated?

The line was splited

The message contains these two lines:
@@ -134,7 +134,11 @@ static int mkreg_ghost(char *path, u32 mode, struct
ghost_file *gf, struct cr_im 

but actulally this is one line
@@ -134,7 +134,11 @@ static int mkreg_ghost(char *path, u32 mode, struct ghost_file *gf, struct cr_im

You can try to download this patch from the mailing list
https://patchwork.criu.org/api/1.0/series/1295/revisions/1/mbox/

and try to apply it with the "git am" tool

[root@fc24 criu]# curl https://patchwork.criu.org/api/1.0/series/1295/revisions/1/mbox/ > m
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3360    0  3360    0     0  17453      0 --:--:-- --:--:-- --:--:-- 17500
[root@fc24 criu]# git am m
Applying: Fixed negative returns issues introduced by remote images code.
fatal: corrupt patch at line 30
Patch failed at 0001 Fixed negative returns issues introduced by remote images code.
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
> 
> I use:
> git commit 
> git format-patch -1 HEAD 
> (copy to email, send)
> 
> However, git send-email seems very cool :-)
> 
>  
> 
>     >       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
>     >
>     >
>     >
>     > _______________________________________________
>     > CRIU mailing list
>     > CRIU@openvz.org
>     > https://lists.openvz.org/mailman/listinfo/criu
> 
>