- When exiting, set the flag "in_exit_cleanup".
authorWayne Davison <wayned@samba.org>
Fri, 13 Oct 2006 07:38:15 +0000 (07:38 +0000)
committerWayne Davison <wayned@samba.org>
Fri, 13 Oct 2006 07:38:15 +0000 (07:38 +0000)
- Mark _exit_cleanup() with NORETURN.
- Don't ever return from _exit_cleanup().

cleanup.c

index 9cf7be0..f1ee321 100644 (file)
--- a/cleanup.c
+++ b/cleanup.c
@@ -87,25 +87,22 @@ static pid_t cleanup_pid = 0;
 
 pid_t cleanup_child_pid = -1;
 
 
 pid_t cleanup_child_pid = -1;
 
+int in_exit_cleanup = 0;
+
 /**
  * Eventually calls exit(), passing @p code, therefore does not return.
  *
  * @param code one of the RERR_* codes from errcode.h.
  **/
 /**
  * Eventually calls exit(), passing @p code, therefore does not return.
  *
  * @param code one of the RERR_* codes from errcode.h.
  **/
-void _exit_cleanup(int code, const char *file, int line)
+NORETURN void _exit_cleanup(int code, const char *file, int line)
 {
        int ocode = code;
 {
        int ocode = code;
-       static int inside_cleanup = 0;
-
-       if (inside_cleanup > 10) {
-               /* prevent the occasional infinite recursion */
-               return;
-       }
-       inside_cleanup++;
 
        SIGACTION(SIGUSR1, SIG_IGN);
        SIGACTION(SIGUSR2, SIG_IGN);
 
 
        SIGACTION(SIGUSR1, SIG_IGN);
        SIGACTION(SIGUSR2, SIG_IGN);
 
+       in_exit_cleanup = 1;
+
        if (verbose > 3) {
                rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): entered\n",
                        code, file, line);
        if (verbose > 3) {
                rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): entered\n",
                        code, file, line);
@@ -113,8 +110,7 @@ void _exit_cleanup(int code, const char *file, int line)
 
        if (cleanup_child_pid != -1) {
                int status;
 
        if (cleanup_child_pid != -1) {
                int status;
-               if (wait_process(cleanup_child_pid, &status, WNOHANG)
-                == cleanup_child_pid) {
+               if (wait_process(cleanup_child_pid, &status, WNOHANG) == cleanup_child_pid) {
                        status = WEXITSTATUS(status);
                        if (status > code)
                                code = status;
                        status = WEXITSTATUS(status);
                        if (status > code)
                                code = status;