|
|
@@ -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)
|