Imported Upstream version 1.8.5
[debian/sudo] / plugins / sudoers / logging.c
index 395f83b41f8b517ed84eb5e885c0270e473686ec..4d3e13e47e0e9c82c20ee5021a2d87cdb6d5ca8c 100644 (file)
@@ -325,18 +325,18 @@ log_allowed(int status)
     debug_return;
 }
 
-void
-log_error(int flags, const char *fmt, ...)
+/*
+ * Perform logging for log_error()/log_fatal()
+ */
+static void
+vlog_error(int flags, const char *fmt, va_list ap)
 {
     int serrno = errno;
     char *logline, *message;
-    va_list ap;
-    debug_decl(log_error, SUDO_DEBUG_LOGGING)
+    debug_decl(vlog_error, SUDO_DEBUG_LOGGING)
 
     /* Expand printf-style format + args. */
-    va_start(ap, fmt);
     evasprintf(&message, fmt, ap);
-    va_end(ap);
 
     /* Become root if we are not already to avoid user interference */
     set_perms(PERM_ROOT|PERM_NOEXIT);
@@ -376,13 +376,40 @@ log_error(int flags, const char *fmt, ...)
 
     restore_perms();
 
-    if (!ISSET(flags, NO_EXIT)) {
-       plugin_cleanup(0);
-       siglongjmp(error_jmp, 1);
-    }
     debug_return;
 }
 
+void
+log_error(int flags, const char *fmt, ...)
+{
+    va_list ap;
+    debug_decl(log_error, SUDO_DEBUG_LOGGING)
+
+    /* Log the error. */
+    va_start(ap, fmt);
+    vlog_error(flags, fmt, ap);
+    va_end(ap);
+
+    debug_return;
+}
+
+void
+log_fatal(int flags, const char *fmt, ...)
+{
+    va_list ap;
+    debug_decl(log_error, SUDO_DEBUG_LOGGING)
+
+    /* Log the error. */
+    va_start(ap, fmt);
+    vlog_error(flags, fmt, ap);
+    va_end(ap);
+
+    /* Exit the plugin. */
+    plugin_cleanup(0);
+    sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
+    siglongjmp(error_jmp, 1);
+}
+
 #define MAX_MAILFLAGS  63
 
 /*
@@ -414,7 +441,7 @@ send_mail(const char *fmt, ...)
        debug_return;
 
     /* Fork and return, child will daemonize. */
-    switch (pid = fork()) {
+    switch (pid = sudo_debug_fork()) {
        case -1:
            /* Error. */
            error(1, _("unable to fork"));
@@ -483,7 +510,7 @@ send_mail(const char *fmt, ...)
        _exit(1);
     }
 
-    switch (pid = fork()) {
+    switch (pid = sudo_debug_fork()) {
        case -1:
            /* Error. */
            mysyslog(LOG_ERR, _("unable to fork: %m"));