Explorar o código

include some important server fixes from cvshome.org CVS trunk

Ralf S. Engelschall %!s(int64=23) %!d(string=hai) anos
pai
achega
33d6b2aea2
Modificáronse 2 ficheiros con 319 adicións e 10 borrados
  1. 315 8
      cvs/cvs.patch
  2. 4 2
      cvs/cvs.spec

+ 315 - 8
cvs/cvs.patch

@@ -1,16 +1,323 @@
-Fix communication hanging in communication shutdown phase, caused by at
-least older CVS clients (version < 1.11.2) and a semantically incorrect
-usage of getc() by the server.
-
---- cvs-1.11.2.orig/src/buffer.c	2001-08-09 21:26:35.000000000 +0200
-+++ cvs-1.11.2/src/buffer.c	2002-08-22 15:40:11.000000000 +0200
-@@ -1378,8 +1378,7 @@
+Index: src/server.c
+===================================================================
+RCS file: /cvs/ccvs/src/server.c,v
+diff -u -d -r1.275 -r1.277
+--- src/server.c	18 Jun 2002 13:35:28 -0000	1.275
++++ src/server.c	14 Aug 2002 13:21:55 -0000	1.277
+@@ -5010,6 +5010,8 @@
+      int argc;
+      char **argv;
+ {
++    char *error_prog_name;		/* Used in error messages */
++
+     if (argc == -1)
+     {
+ 	static const char *const msg[] =
+@@ -5165,39 +5167,18 @@
+     /* Small for testing.  */
+     argument_vector_size = 1;
+     argument_vector =
+-	(char **) malloc (argument_vector_size * sizeof (char *));
+-    if (argument_vector == NULL)
+-    {
+-	/*
+-	 * Strictly speaking, we're not supposed to output anything
+-	 * now.  But we're about to exit(), give it a try.
+-	 */
+-	printf ("E Fatal server error, aborting.\n\
+-error ENOMEM Virtual memory exhausted.\n");
+-
+-	/* I'm doing this manually rather than via error_exit ()
+-	   because I'm not sure whether we want to call server_cleanup.
+-	   Needs more investigation....  */
+-
+-#ifdef SYSTEM_CLEANUP
+-	/* Hook for OS-specific behavior, for example socket subsystems on
+-	   NT and OS2 or dealing with windows and arguments on Mac.  */
+-	SYSTEM_CLEANUP ();
+-#endif
+-
+-	exit (EXIT_FAILURE);
+-    }
+-
++	(char **) xmalloc (argument_vector_size * sizeof (char *));
+     argument_count = 1;
+     /* This gets printed if the client supports an option which the
+        server doesn't, causing the server to print a usage message.
+-       FIXME: probably should be using program_name here.
+        FIXME: just a nit, I suppose, but the usage message the server
+        prints isn't literally true--it suggests "cvs server" followed
+        by options which are for a particular command.  Might be nice to
+        say something like "client apparently supports an option not supported
+        by this server" or something like that instead of usage message.  */
+-    argument_vector[0] = "cvs server";
++    error_prog_name = xmalloc( strlen(program_name) + 8 );
++    sprintf(error_prog_name, "%s server", program_name);
++    argument_vector[0] = error_prog_name;
+ 
+     while (1)
+     {
+@@ -5270,6 +5251,7 @@
+ 	}
+ 	free (orig_cmd);
+     }
++    free(error_prog_name);
+     server_cleanup (0);
+     return 0;
+ }
+@@ -5419,8 +5401,8 @@
+     int found_it = 0;
+     int namelen;
+ 
+-    /* We don't use current_parsed_root->directory because it hasn't been set yet
+-     * -- our `repository' argument came from the authentication
++    /* We don't use current_parsed_root->directory because it hasn't been
++     * set yet -- our `repository' argument came from the authentication
+      * protocol, not the regular CVS protocol.
+      */
+ 
+@@ -5578,7 +5560,7 @@
+     {
+ 	/* No cvs password found, so try /etc/passwd. */
+ 
+-	const char *found_passwd = NULL;
++	char *found_passwd = NULL;
+ 	struct passwd *pw;
+ #ifdef HAVE_GETSPNAM
+ 	struct spwd *spw;
+Index: src/server.c
+===================================================================
+RCS file: /cvs/ccvs/src/server.c,v
+diff -u -d -r1.279 -r1.280
+--- src/server.c	16 Sep 2002 14:56:25 -0000	1.279
++++ src/server.c	4 Oct 2002 19:56:01 -0000	1.280
+@@ -3213,10 +3213,13 @@
+ 	buf_flush (buf_to_net, 1);
+ 	buf_shutdown (protocol_inbuf);
+ 	buf_free (protocol_inbuf);
++	protocol_inbuf = NULL;
+ 	buf_shutdown (stderrbuf);
+ 	buf_free (stderrbuf);
++	stderrbuf = NULL;
+ 	buf_shutdown (stdoutbuf);
+ 	buf_free (stdoutbuf);
++	stdoutbuf = NULL;
+     }
+ 
+     if (errs)
+@@ -4891,9 +4894,9 @@
+ 
+ 	status = buf_shutdown (buf_from_net);
+ 	if (status != 0)
+-	{
+ 	    error (0, status, "shutting down buffer from client");
+-	}
++	buf_free (buf_from_net);
++	buf_from_net = NULL;
+     }
+ 
+     if (dont_delete_temp)
+@@ -4902,6 +4905,9 @@
+ 	{
+ 	    (void) buf_flush (buf_to_net, 1);
+ 	    (void) buf_shutdown (buf_to_net);
++	    buf_free (buf_to_net);
++	    buf_to_net = NULL;
++	    error_use_protocol = 0;
+ 	}
+ 	return;
+     }
+@@ -5003,6 +5009,9 @@
+     {
+ 	(void) buf_flush (buf_to_net, 1);
+ 	(void) buf_shutdown (buf_to_net);
++	buf_free (buf_to_net);
++	buf_to_net = NULL;
++	error_use_protocol = 0;
+     }
+ }
+ 
+@@ -5146,25 +5155,6 @@
+ 	}
+     }
+ 
+-#ifdef SIGABRT
+-    (void) SIG_register (SIGABRT, server_cleanup);
+-#endif
+-#ifdef SIGHUP
+-    (void) SIG_register (SIGHUP, server_cleanup);
+-#endif
+-#ifdef SIGINT
+-    (void) SIG_register (SIGINT, server_cleanup);
+-#endif
+-#ifdef SIGQUIT
+-    (void) SIG_register (SIGQUIT, server_cleanup);
+-#endif
+-#ifdef SIGPIPE
+-    (void) SIG_register (SIGPIPE, server_cleanup);
+-#endif
+-#ifdef SIGTERM
+-    (void) SIG_register (SIGTERM, server_cleanup);
+-#endif
+-
+     /* Now initialize our argument vector (for arguments from the client).  */
+ 
+     /* Small for testing.  */
+@@ -6352,12 +6342,12 @@
+     if (len == 0)
+ 	len = strlen (str);
+ #ifdef SERVER_SUPPORT
+-    if (error_use_protocol)
++    if (error_use_protocol && buf_to_net != NULL)
+     {
+ 	buf_output (saved_output, str, len);
+ 	buf_copy_lines (buf_to_net, saved_output, 'M');
+     }
+-    else if (server_active)
++    else if (server_active && protocol != NULL)
+     {
+ 	buf_output (saved_output, str, len);
+ 	buf_copy_lines (protocol, saved_output, 'M');
+Index: src/server.c
+===================================================================
+RCS file: /cvs/ccvs/src/server.c,v
+diff -u -d -r1.280 -r1.281
+--- src/server.c	4 Oct 2002 19:56:01 -0000	1.280
++++ src/server.c	25 Oct 2002 19:35:07 -0000	1.281
+@@ -710,17 +710,7 @@
+ 	       cause deadlock, as noted in server_cleanup.  */
+ 	    buf_flush (buf_to_net, 1);
+ 
+-	    /* I'm doing this manually rather than via error_exit ()
+-	       because I'm not sure whether we want to call server_cleanup.
+-	       Needs more investigation....  */
+-
+-#ifdef SYSTEM_CLEANUP
+-	    /* Hook for OS-specific behavior, for example socket subsystems on
+-	       NT and OS2 or dealing with windows and arguments on Mac.  */
+-	    SYSTEM_CLEANUP ();
+-#endif
+-
+-	    exit (EXIT_FAILURE);
++	    error_exit ();
+ 	}
+ 	else if (rs->status == rs_optional)
+ 	    rs->status = rs_not_supported;
+@@ -5080,18 +5070,7 @@
+ 		printf ("E Fatal server error, aborting.\n\
+ error ENOMEM Virtual memory exhausted.\n");
+ 
+-		/* I'm doing this manually rather than via error_exit ()
+-		   because I'm not sure whether we want to call server_cleanup.
+-		   Needs more investigation....  */
+-
+-#ifdef SYSTEM_CLEANUP
+-		/* Hook for OS-specific behavior, for example socket
+-		   subsystems on NT and OS2 or dealing with windows
+-		   and arguments on Mac.  */
+-		SYSTEM_CLEANUP ();
+-#endif
+-
+-		exit (EXIT_FAILURE);
++		error_exit ();
+ 	    }
+ 	    strcpy (server_temp_dir, Tmpdir);
+ 
+@@ -5575,17 +5554,7 @@
+ 	    printf ("E Fatal error, aborting.\n\
+ error 0 %s: no such user\n", username);
+ 
+-	    /* I'm doing this manually rather than via error_exit ()
+-	       because I'm not sure whether we want to call server_cleanup.
+-	       Needs more investigation....  */
+-
+-#ifdef SYSTEM_CLEANUP
+-	    /* Hook for OS-specific behavior, for example socket subsystems on
+-	       NT and OS2 or dealing with windows and arguments on Mac.  */
+-	    SYSTEM_CLEANUP ();
+-#endif
+-
+-	    exit (EXIT_FAILURE);
++	    error_exit ();
+ 	}
+ 
+ 	/* Allow for dain bramaged HPUX passwd aging
+@@ -5635,16 +5604,7 @@
+ 	   outweighs this.  */
+ 	printf ("error 0 no such user %s in CVSROOT/passwd\n", username);
+ 
+-	/* I'm doing this manually rather than via error_exit ()
+-	   because I'm not sure whether we want to call server_cleanup.
+-	   Needs more investigation....  */
+-
+-#ifdef SYSTEM_CLEANUP
+-	/* Hook for OS-specific behavior, for example socket subsystems on
+-	   NT and OS2 or dealing with windows and arguments on Mac.  */
+-	SYSTEM_CLEANUP ();
+-#endif
+-	exit (EXIT_FAILURE);
++	error_exit ();
+     }
+     else
+     {
+@@ -5901,12 +5861,8 @@
+     {
+ 	printf ("E Fatal error, aborting.\n\
+ error %s getpeername or getsockname failed\n", strerror (errno));
+-#ifdef SYSTEM_CLEANUP
+-	/* Hook for OS-specific behavior, for example socket subsystems on
+-	   NT and OS2 or dealing with windows and arguments on Mac.  */
+-	SYSTEM_CLEANUP ();
+-#endif
+-	exit (EXIT_FAILURE);
++
++	error_exit ();
+     }
+ 
+ #ifdef SO_KEEPALIVE
+@@ -5932,12 +5888,8 @@
+     {
+ 	printf ("E Fatal error, aborting.\n\
+ error 0 kerberos: %s\n", krb_get_err_text(status));
+-#ifdef SYSTEM_CLEANUP
+-	/* Hook for OS-specific behavior, for example socket subsystems on
+-	   NT and OS2 or dealing with windows and arguments on Mac.  */
+-	SYSTEM_CLEANUP ();
+-#endif
+-	exit (EXIT_FAILURE);
++
++	error_exit ();
+     }
+ 
+     memcpy (kblock, auth.session, sizeof (C_Block));
+@@ -5948,12 +5900,8 @@
+     {
+ 	printf ("E Fatal error, aborting.\n\
+ error 0 kerberos: can't get local name: %s\n", krb_get_err_text(status));
+-#ifdef SYSTEM_CLEANUP
+-	/* Hook for OS-specific behavior, for example socket subsystems on
+-	   NT and OS2 or dealing with windows and arguments on Mac.  */
+-	SYSTEM_CLEANUP ();
+-#endif
+-	exit (EXIT_FAILURE);
++
++	error_exit ();
+     }
+ 
+     /* Switch to run as this user. */
+Index: src/buffer.c
+===================================================================
+RCS file: /cvs/ccvs/src/buffer.c,v
+diff -u -d -r1.19 -r1.20
+--- src/buffer.c	20 May 2002 18:27:55 -0000	1.19
++++ src/buffer.c	24 Oct 2002 19:54:58 -0000	1.20
+@@ -1392,8 +1392,7 @@
  
      if (buf->input)
      {
 -	if (! buf_empty_p (buf)
 -	    || getc (bc->fp) != EOF)
-+	if (! buf_empty_p (buf))
++	if ( !buf_empty_p (buf) )
  	{
  # ifdef SERVER_SUPPORT
  	    if (server_active)

+ 4 - 2
cvs/cvs.spec

@@ -45,7 +45,7 @@ Distribution: OpenPKG [BASE]
 Group:        SCM
 License:      GPL
 Version:      %{V_cvs}
-Release:      20021002
+Release:      20021211
 
 #   list of sources
 Source0:      http://www.cvshome.org/files/19/10/cvs-%{V_cvs}.tar.gz
@@ -94,8 +94,10 @@ AutoReqProv:  no
 
 %prep
     %setup0 -q -c
-    %patch0 -p0
     %setup1 -q -T -D -a 1
+    ( cd cvs-%{V_cvs}
+      %patch0 -p0
+    )
 %if "%{with_rse_patches}" == "yes"
     ( cd cvs-%{V_cvs}
       cat %{SOURCE cvs.patches.rse} |\