Hi, we ran into a little problem with rsync-2.5.5. Setup: you run rsync-2.5.5 as normal rsync over ssh (ie. not connecting to a rsync server). If you start such a rsync but interrupt the pulling process with Ctrl-C, the process on the other side may start to allocate all memory on the remote machine. As fa as we have analyzed the problem, the remote rsync process wants to issue a error message that it could not write 4096 bytes, receives a SIGPIPE and errno is set to EPIPE in the fwrite call (line 279 in log.c). Then exit_cleanup is called which in turn will call the same routine again and will of course get EPIPE again and the loop continues (as long as we have memory to recursivly call the same functions again and again). As a quick workaround we have the following patch, since there is no real point in trying to issue an error message if you have already received EPIPE on write. --- log.c +++ log.c 2002/10/08 11:55:52 @@ -276,7 +276,7 @@ if (!f) exit_cleanup(RERR_MESSAGEIO); - if (fwrite(buf, len, 1, f) != 1) exit_cleanup(RERR_MESSAGEIO); + if (fwrite(buf, len, 1, f) != 1 && errno != EPIPE) exit_cleanup(RERR_MESSAGEIO); if (buf[len-1] == '\r' || buf[len-1] == '\n') fflush(f); } -- with kind regards (mit freundlichem Grinsen), Ruediger Oertel (ro@suse.de,bugfinder@t-online.de) ----------This machine does not crash randomly.----------- It only schedules a hangup when deemed appropriate.
On Wed, 9 Oct 2002 10:03:33 +0200 (CEST) Ruediger Oertel <ro@suse.de> wrote:> Hi, > > we ran into a little problem with rsync-2.5.5. > > Setup: you run rsync-2.5.5 as normal rsync over ssh > (ie. not connecting to a rsync server). If you start > such a rsync but interrupt the pulling process with Ctrl-C, > the process on the other side may start to allocate all > memory on the remote machine. > > As fa as we have analyzed the problem, the remote rsync > process wants to issue a error message that it could not > write 4096 bytes, receives a SIGPIPE and errno is set to EPIPE > in the fwrite call (line 279 in log.c). Then exit_cleanup is called > which in turn will call the same routine again and will of course > get EPIPE again and the loop continues (as long as we have memory > to recursivly call the same functions again and again). > > As a quick workaround we have the following patch, since there is > no real point in trying to issue an error message if you have > already received EPIPE on write. > > --- log.c > +++ log.c 2002/10/08 11:55:52 > @@ -276,7 +276,7 @@ > > if (!f) exit_cleanup(RERR_MESSAGEIO); > > - if (fwrite(buf, len, 1, f) != 1) exit_cleanup(RERR_MESSAGEIO); > + if (fwrite(buf, len, 1, f) != 1 && errno != EPIPE) > exit_cleanup(RERR_MESSAGEIO); > > if (buf[len-1] == '\r' || buf[len-1] == '\n') fflush(f); > } >I've had the same problem, but in different situation: when rsync was started as piped child (I did it in "rsync" method for apt). My fist path was above one, but later I've found that problem is in exit_cleanup(). I use this patch: --- rsync-2.5.5/cleanup.c 2002-03-27 02:03:13 +0100 +++ rsync-2.5.5.cleanup/cleanup.c 2002-07-11 12:53:52 +0200 @@ -43,6 +43,11 @@ int ocode = code; extern int keep_partial; extern int log_got_error; + static int inside_cleanup = 0; + + if (inside_cleanup != 0) + return; + inside_cleanup = 1; signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN); -- Sviatoslav Sviridov [mailto:svd@lintec.minsk.by] [ICQ#10845380] [Lintec Project] [MLUG] -- Everyone who comes in here wants three things: (1) They want it quick. (2) They want it good. (3) They want it cheap. I tell 'em to pick two and call me back. -- sign on the back wall of a small printing company
I noticed this behavior earlier. Thanks for the patch. eric Ruediger Oertel wrote:> > Hi, > > we ran into a little problem with rsync-2.5.5. > > Setup: you run rsync-2.5.5 as normal rsync over ssh > (ie. not connecting to a rsync server). If you start > such a rsync but interrupt the pulling process with Ctrl-C, > the process on the other side may start to allocate all > memory on the remote machine. > > As fa as we have analyzed the problem, the remote rsync > process wants to issue a error message that it could not > write 4096 bytes, receives a SIGPIPE and errno is set to EPIPE > in the fwrite call (line 279 in log.c). Then exit_cleanup is called > which in turn will call the same routine again and will of course > get EPIPE again and the loop continues (as long as we have memory > to recursivly call the same functions again and again). > > As a quick workaround we have the following patch, since there is > no real point in trying to issue an error message if you have > already received EPIPE on write. > > --- log.c > +++ log.c 2002/10/08 11:55:52 > @@ -276,7 +276,7 @@ > > if (!f) exit_cleanup(RERR_MESSAGEIO); > > - if (fwrite(buf, len, 1, f) != 1) exit_cleanup(RERR_MESSAGEIO); > + if (fwrite(buf, len, 1, f) != 1 && errno != EPIPE) exit_cleanup(RERR_MESSAGEIO); > > if (buf[len-1] == '\r' || buf[len-1] == '\n') fflush(f); > } > > -- > with kind regards (mit freundlichem Grinsen), > Ruediger Oertel (ro@suse.de,bugfinder@t-online.de) > ----------This machine does not crash randomly.----------- > It only schedules a hangup when deemed appropriate. > > -- > To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync > Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html