On May 9,  4:51pm, [EMAIL PROTECTED] (Dave Dykstra) wrote:
-- Subject: Re: [PATCH] rsync kills all user processes on fork failure
>
> What's the best fix against the current CVS?  Should we back out the
> previous fix because that one only solved half the problem?  Somebody
> please provide an updated patch.
> 
-- End of excerpt from Dave Dykstra

I've appended an updated patch that can be applied to the current CVS.

Description:

        --  Be extra careful: reject any negative pid in do_fork(),
            not just -1 (since other negative values would also be
            harmful if they were ever passed to kill, even though
            such values should never occur).

        --  Expand all_pids[] dynamically as needed in do_fork(), to
            avoid any possibility of overflow.

        --  Prevent kill(-1, SIGUSR2) in main.c; this is independent of
            the interaction between do_fork() and kill_all(), which
            involves SIGUSR1.

Bob Byrnes                        e-mail: [EMAIL PROTECTED]
Curl Corporation                  phone:  617-761-1200
400 Technology Square, 8th Floor  fax:    617-761-1201
Cambridge, MA  02139

--- util.c.orig Thu May  9 22:12:37 2002
+++ util.c      Thu May  9 22:15:20 2002
@@ -373,15 +373,25 @@
 }
 
 
-static pid_t all_pids[10];
+static pid_t *all_pids;
 static int num_pids;
+static int max_pids;
+
+#define MIN_PIDS 16
 
 /** Fork and record the pid of the child. **/
 pid_t do_fork(void)
 {
        pid_t newpid = fork();
        
-       if (newpid != 0  &&  newpid != -1) {
+       /* we must ensure that newpid == -1 is not recorded in all_pids
+          if fork() fails, otherwise kill_all() could nuke the world! */
+       if (newpid > 0) {
+               if (num_pids >= max_pids) {
+                       max_pids = (max_pids ? 2*max_pids : MIN_PIDS);
+                       all_pids = (pid_t *)Realloc(all_pids, sizeof(pid_t)*max_pids);
+                       if (!all_pids) out_of_memory("do_fork");
+               }
                all_pids[num_pids++] = newpid;
        }
        return newpid;
--- main.c.orig Thu May  9 22:12:31 2002
+++ main.c      Thu May  9 22:15:28 2002
@@ -408,6 +408,13 @@
                        ;
        }
 
+       /* if fork fails, we must avoid doing kill(-1, SIGUSR2) later,
+          since that could nuke the world! */
+       if (pid < 0) {
+               rprintf(FERROR,"could not fork in do_recv: %s\n",strerror(errno));
+               exit_cleanup(RERR_IPC);
+       }
+
        close(recv_pipe[1]);
        close(error_pipe[1]);
        if (f_in != f_out) close(f_in);


-- 
To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html

Reply via email to