Does the attached, more general, patch do the trick for you?

I think the problem is deeper - error() really needs a way to bypass the
memory allocation of the buffer routines, but this should work around
the problem for now.

Cheers,

Derek


Thorsten Glaser wrote:

>Hello!
>
>Please apply the following patch. It prevents GNU CVS 1.12.12
>from looping endlessly and dumping core due to lack of stack
>(recursion depth) when /dev/zero cannot be found, for example
>in a chroot(2) environment.
>
>I have copyright assignments for CVS filed with the FSF.
>
>//mirabile
>
>

Index: src/error.c
===================================================================
RCS file: /cvs/ccvs/src/error.c,v
retrieving revision 1.42
diff -u -p -r1.42 error.c
--- src/error.c 18 Mar 2005 16:41:24 -0000      1.42
+++ src/error.c 4 May 2005 14:14:29 -0000
@@ -119,6 +119,10 @@ error (int status, int errnum, const cha
     char statcmdbuf[32];
     char *cmdbuf;
     char *emptybuf = "";
+    static bool in_error = false;
+
+    if (in_error) goto recursion_error;
+    in_error = true;

     /* Initialize these to avoid a lot of special case error handling.  */
     buf = statbuf;
@@ -173,6 +177,9 @@ error (int status, int errnum, const cha
     /* Restore errno per our charter.  */
     errno = save_errno;

+    /* Reset our recursion lock.  */
+    in_error = false;
+
     /* Done.  */
     return;

@@ -195,6 +202,21 @@ memerror:
 #endif /* HAVE_SYSLOG_H */

     exit (EXIT_FAILURE);
+
+recursion_error:
+#if HAVE_SYSLOG_H
+    syslog (LOG_DAEMON | LOG_EMERG,
+           "error (%d, %d) called recursively.  Message was:",
+           status, errnum);
+
+    va_start (args, message);
+    vsyslog (LOG_DAEMON | LOG_EMERG, message, args);
+    va_end (args);
+
+    syslog (LOG_DAEMON | LOG_EMERG, "Aborting.");
+#endif /* HAVE_SYSLOG_H */
+
+    exit (EXIT_FAILURE);
 }


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Bug-cvs mailing list
Bug-cvs@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-cvs

Reply via email to