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);
}
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Bug-cvs mailing list [email protected] http://lists.gnu.org/mailman/listinfo/bug-cvs
