]> granicus.if.org Git - sudo/commitdiff
Cannot wrap sigsetjmp() or we end up returning to the wrong place.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 29 Nov 2012 11:37:13 +0000 (06:37 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 29 Nov 2012 11:37:13 +0000 (06:37 -0500)
Use a macro instead.

common/error.c
include/error.h
plugins/sudoers/iolog.c
plugins/sudoers/logging.c
plugins/sudoers/policy.c
plugins/sudoers/sudoers.c
plugins/sudoers/sudoers.h

index fd6cd85b5b9844d9fc20bc0052aee484f6022675..6c5f878f458e78a2b5da17dfd44c7c9614d0dcef 100644 (file)
@@ -37,7 +37,7 @@
 #define DEFAULT_TEXT_DOMAIN    "sudo"
 #include "gettext.h"
 
-static sigjmp_buf error_jmp;
+sigjmp_buf error_jmp;
 static bool setjmp_enabled = false;
 static struct sudo_error_callback {
     void (*func)(void);
@@ -180,21 +180,14 @@ error_callback_register(void (*func)(void))
     return 0;
 }
 
-int
-plugin_setjmp(void)
-{
-    setjmp_enabled = true;
-    return sigsetjmp(error_jmp, 1);
-}
-
 void
-plugin_longjmp(int val)
+error_disable_setjmp(void)
 {
-    siglongjmp(error_jmp, val);
+    setjmp_enabled = false;
 }
 
 void
-plugin_clearjmp(void)
+error_enable_setjmp(void)
 {
-    setjmp_enabled = false;
+    setjmp_enabled = true;
 }
index 8d80cf7fd758d04b9cd6ec688dd35b84b9c56090..88360f84cb3dce994c364c1c7df78c77d7b14f00 100644 (file)
@@ -18,6 +18,7 @@
 #define        _SUDO_ERROR_H_
 
 #include <stdarg.h>
+#include <setjmp.h>
 
 /*
  * We wrap error/errorx and warn/warnx so that the same output can
     warning_restore_locale();                                                 \
 } while (0)
 
+#define error_setjmp()         (error_enable_setjmp(), sigsetjmp(error_jmp, 1))
+#define error_longjmp(val)     siglongjmp(error_jmp, val)
+
 extern int (*sudo_printf)(int msg_type, const char *fmt, ...);
+extern sigjmp_buf error_jmp;
 
 int     error_callback_register(void (*func)(void));
+void   error_disable_setjmp(void);
+void   error_enable_setjmp(void);
 void   error2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
 void   errorx2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
 void   verror2(int, const char *, va_list ap) __attribute__((__noreturn__));
index 60fba61321de4a3dc1a880ac7e5ad3eba808f6bb..88750312abd027bd88cda5152efeef21341a2001 100644 (file)
@@ -472,7 +472,7 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
     if (argc == 0)
        debug_return_bool(true);
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
        rval = -1;
        goto done;
@@ -597,7 +597,7 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
     rval = true;
 
 done:
-    plugin_clearjmp();
+    error_disable_setjmp();
     efree(tofree);
     if (details.runas_pw)
        sudo_pw_delref(details.runas_pw);
@@ -615,9 +615,9 @@ sudoers_io_close(int exit_status, int error)
     int i;
     debug_decl(sudoers_io_close, SUDO_DEBUG_PLUGIN)
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return;
     }
 
@@ -639,9 +639,9 @@ sudoers_io_version(int verbose)
 {
     debug_decl(sudoers_io_version, SUDO_DEBUG_PLUGIN)
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return_bool(-1);
     }
 
@@ -662,9 +662,9 @@ sudoers_io_log(const char *buf, unsigned int len, int idx)
 
     gettimeofday(&now, NULL);
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return_bool(-1);
     }
 
index 3aed994b024c2162a3a11e3c76bce6f730271760..f17938553007b200fcaca52441b0a8344cd6b067 100644 (file)
@@ -527,7 +527,7 @@ log_fatal(int flags, const char *fmt, ...)
     /* Exit the plugin. */
     sudoers_cleanup();
     sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
-    plugin_longjmp(1);
+    error_longjmp(1);
 }
 
 #define MAX_MAILFLAGS  63
index c65cab9f368ef2fbd44f4600b6093ca3f7d2eb83..e0cff9f2df174937dcbfe07e63ac2b2af22e793b 100644 (file)
@@ -465,10 +465,10 @@ sudoers_policy_open(unsigned int version, sudo_conv_t conversation,
     if (sudo_version < SUDO_API_MKVERSION(1, 2))
        args = NULL;
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
        rewind_perms();
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return_bool(-1);
     }
 
@@ -484,9 +484,9 @@ sudoers_policy_close(int exit_status, int error_code)
 {
     debug_decl(sudoers_policy_close, SUDO_DEBUG_PLUGIN)
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return;
     }
 
@@ -534,9 +534,9 @@ sudoers_policy_init_session(struct passwd *pwd, char **user_env[])
     if (sudo_version < SUDO_API_MKVERSION(1, 2))
        user_env = NULL;
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* called via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return_bool(-1);
     }
 
@@ -577,11 +577,11 @@ sudoers_policy_invalidate(int remove)
     debug_decl(sudoers_policy_invalidate, SUDO_DEBUG_PLUGIN)
 
     user_cmnd = "kill";
-    if (plugin_setjmp() == 0) {
+    if (error_setjmp() == 0) {
        remove_timestamp(remove);
        sudoers_cleanup();
     }
-    plugin_clearjmp();
+    error_disable_setjmp();
 
     debug_return;
 }
@@ -621,9 +621,9 @@ sudoers_policy_version(int verbose)
 {
     debug_decl(sudoers_policy_version, SUDO_DEBUG_PLUGIN)
 
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* error recovery via error(), errorx() or log_fatal() */
-       plugin_clearjmp();
+       error_disable_setjmp();
        debug_return_bool(-1);
     }
 
index a35df036d82eb40deee8b4c3b950d3dcea7b7ff9..f10d4193a4f99dfd528358293ecf79813c7c28b3 100644 (file)
@@ -233,7 +233,7 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
     (void) sigaction(SIGTSTP, &sa, &saved_sa_tstp);
 
     /* XXX - would like to move this to policy.c but need the cleanup. */
-    if (plugin_setjmp() != 0) {
+    if (error_setjmp() != 0) {
        /* error recovery via error(), errorx() or log_fatal() */
        rval = -1;
        goto done;
@@ -524,7 +524,7 @@ bad:
     rval = false;
 
 done:
-    plugin_clearjmp();
+    error_disable_setjmp();
     rewind_perms();
 
     /* Restore signal handlers before we exec. */
index 3acf6daecaaa7e409121ad9e6ecff060cf7f2d97..4a3f6e0b2ea418cd28f915dba099bb8c0f6469e0 100644 (file)
@@ -369,11 +369,6 @@ int group_plugin_query(const char *user, const char *group,
 /* setgroups.c */
 int sudo_setgroups(int ngids, const GETGROUPS_T *gids);
 
-/* plugin_error.c */
-int plugin_setjmp(void);
-void plugin_clearjmp(void);
-void plugin_longjmp(int val) __attribute__((__noreturn__));
-
 #ifndef _SUDO_MAIN
 extern struct sudo_user sudo_user;
 extern struct passwd *list_pw;