]> granicus.if.org Git - sudo/commitdiff
Use siglongjmp() in log_error for fatal errors
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Mar 2010 11:06:11 +0000 (07:06 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Mar 2010 11:06:11 +0000 (07:06 -0400)
plugins/sudoers/logging.c

index 2c6ec5f1f87b20361bafb1fafba2135985d62070..ff72697db997c173801779d3e52f8d15bf7e4cde 100644 (file)
@@ -54,6 +54,7 @@
 #include <time.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <setjmp.h>
 
 #include "sudoers.h"
 
@@ -64,6 +65,8 @@ static int should_mail                __P((int));
 static void mysyslog           __P((int, const char *, ...));
 static char *new_logline       __P((const char *, int));
 
+extern sigjmp_buf error_jmp;
+
 #define MAXSYSLOGTRIES 16      /* num of retries for broken syslogs */
 
 /*
@@ -368,7 +371,6 @@ log_error(flags, fmt, va_alist)
     va_end(ap);
 
     /* Become root if we are not already to avoid user interference */
-    /* XXX - could longjmp back with wrong uid */
     set_perms(PERM_ROOT|PERM_NOEXIT);
 
     if (ISSET(flags, MSG_ONLY))
@@ -404,14 +406,12 @@ log_error(flags, fmt, va_alist)
 
     efree(logline);
 
-#if 0 /* XXX - longjmp instead */
+    set_perms(PERM_USER);
+
     if (!ISSET(flags, NO_EXIT)) {
        cleanup(0);
-       exit(1);
+       siglongjmp(error_jmp, 1);
     }
-#endif
-
-    set_perms(PERM_USER);
 }
 
 #define MAX_MAILFLAGS  63