Noel L Yap writes:
> 
> I'm having problems adding functionality that uses the client/server protocol.
> After so many calls to send_file_names(), the server starts getting "Too many
> open files" errors on a call to pipe(protocol_pipe).  I suspect that somewhere
> on the server, file descriptors aren't being closed.  The problem is that it's
> extremely difficult to hunt down.

Yep, every time the server executes a CVS command, it leaks four FDs. 
I've checked in a fix, here's a patch for anyone who wants it:

Index: server.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/server.c,v
retrieving revision 1.228
retrieving revision 1.229
diff -u -r1.228 -r1.229
--- server.c    2000/05/19 17:01:33     1.228
+++ server.c    2000/06/03 16:35:42     1.229
@@ -2745,8 +2745,11 @@
            error (1, errno, "can't set up pipes");
        if (dup2 (stderr_pipe[1], STDERR_FILENO) < 0)
            error (1, errno, "can't set up pipes");
+       close (dev_null_fd);
        close (stdout_pipe[0]);
+       close (stdout_pipe[1]);
        close (stderr_pipe[0]);
+       close (stderr_pipe[1]);
        close (protocol_pipe[0]);
 #ifdef SERVER_FLOWCONTROL
        close (flowcontrol_pipe[1]);
@@ -2961,7 +2964,10 @@
                buf_copy_lines (buf_to_net, stdoutbuf, 'M');
 
                if (status == -1)
+               {
+                   close (stdout_pipe[0]);
                    stdout_pipe[0] = -1;
+               }
                else if (status > 0)
                {
                    buf_output0 (buf_to_net, "E buf_input_data failed\n");
@@ -2983,7 +2989,10 @@
                buf_copy_lines (buf_to_net, stderrbuf, 'E');
 
                if (status == -1)
+               {
+                   close (stderr_pipe[0]);
                    stderr_pipe[0] = -1;
+               }
                else if (status > 0)
                {
                    buf_output0 (buf_to_net, "E buf_input_data failed\n");
@@ -3005,7 +3014,10 @@
                status = buf_input_data (protocol_inbuf, &count_read);
 
                if (status == -1)
+               {
+                   close (protocol_pipe[0]);
                    protocol_pipe[0] = -1;
+               }
                else if (status > 0)
                {
                    buf_output0 (buf_to_net, "E buf_input_data failed\n");
@@ -3066,6 +3078,11 @@
            buf_output0 (buf_to_net,
                         "E Protocol error: uncounted data discarded\n");
 
+#ifdef SERVER_FLOWCONTROL
+       close (flowcontrol_pipe[1]);
+       flowcontrol_pipe[1] = -1;
+#endif /* SERVER_FLOWCONTROL */
+
        errs = 0;
 
        while (command_pid > 0)
@@ -3150,6 +3167,10 @@
     close (stderr_pipe[1]);
     close (stdout_pipe[0]);
     close (stdout_pipe[1]);
+#ifdef SERVER_FLOWCONTROL
+    close (flowcontrol_pipe[0]);
+    close (flowcontrol_pipe[1]);
+#endif /* SERVER_FLOWCONTROL */
 
  free_args_and_return:
     /* Now free the arguments.  */

-Larry Jones

Girls are like slugs -- they probably serve some purpose, but
it's hard to imagine what. -- Calvin

Reply via email to