[patch] Still a problem with cleanup.c

Dave Dykstra dwd at drdykstra.us
Sun Jan 26 03:57:01 EST 2003


I couldn't reproduce the problem on Linux, but I believe you that it's
a problem.  If you think about it, it's easy to see why code that called
_exit_cleanup() might behave strangely if the function returns so I
like the fix of not returning until the situation gets deeply nested.
I submitted the patch.

Thanks Marc & Brian.

- Dave Dykstra

On Thu, Jan 23, 2003 at 08:29:40PM -0500, Brian Poole wrote:
> Hello,
> 
> There is still a problem with the _exit_cleanup() function in 
> cleanup.c despite the patch that was put in last week that prevented
> recursion. It turns out that sometimes multiple calls in close 
> sequence are done and this causes rsync to spin out of control 
> instead of exiting.
> 
> This bug was found by Marc Espie and the patch I'm including is 
> his as well. It hasn't been commited to the OpenBSD tree yet and
> is still undergoing testing but it does fix the immediate easily 
> detectable problem. His post with the bug fix was here:
> 
> http://marc.theaimsgroup.com/?l=openbsd-tech&m=104238879828005&w=2
> 
> I've changed the variable names to match what is in the rsync 
> tree already. 
> 
> This bug is easily triggerable with a local rsync copy. 
> 
> rsync -av /some/reasonably/large/dir /tmp/somewhere
> 
> Wait until after the copy has started (after it is done with
> building the file list) and then hit ctrl-c. Watch rsync fill
> the screen with messages like:
> 
> rsync: connection unexpectedly closed (94819 bytes read so far)
> rsync: connection unexpectedly closed (94819 bytes read so far)
> rsync: connection unexpectedly closed (94819 bytes read so far)
> 
> Curse.
> Switch to another window and kill -9 the errant rsync process.
> Apply patch and notice it no longer goes crazy.
> 
> 
> -b
> 
> Index: cleanup.c
> ===================================================================
> RCS file: /cvsroot/rsync/cleanup.c,v
> retrieving revision 1.15
> diff -u -r1.15 cleanup.c
> --- cleanup.c	16 Jan 2003 20:09:31 -0000	1.15
> +++ cleanup.c	24 Jan 2003 01:24:09 -0000
> @@ -63,11 +63,11 @@
>  	extern int log_got_error;
>  	static int inside_cleanup = 0;
>  
> -	if (inside_cleanup != 0) {
> +	if (inside_cleanup > 10) {
>  		/* prevent the occasional infinite recursion */
>  		return;
>  	}
> -	inside_cleanup = 1;
> +	inside_cleanup++;
>  
>  	signal(SIGUSR1, SIG_IGN);
>  	signal(SIGUSR2, SIG_IGN);

> Index: cleanup.c
> ===================================================================
> RCS file: /cvsroot/rsync/cleanup.c,v
> retrieving revision 1.15
> diff -u -r1.15 cleanup.c
> --- cleanup.c	16 Jan 2003 20:09:31 -0000	1.15
> +++ cleanup.c	24 Jan 2003 01:24:09 -0000
> @@ -63,11 +63,11 @@
>  	extern int log_got_error;
>  	static int inside_cleanup = 0;
>  
> -	if (inside_cleanup != 0) {
> +	if (inside_cleanup > 10) {
>  		/* prevent the occasional infinite recursion */
>  		return;
>  	}
> -	inside_cleanup = 1;
> +	inside_cleanup++;
>  
>  	signal(SIGUSR1, SIG_IGN);
>  	signal(SIGUSR2, SIG_IGN);




More information about the rsync mailing list