#include "sudoers.h"
-extern sigjmp_buf error_jmp;
-
union io_fd {
FILE *f;
#ifdef HAVE_ZLIB_H
if (argc == 0)
debug_return_bool(true);
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
rval = -1;
goto done;
rval = true;
done:
+ plugin_clearjmp();
efree(tofree);
if (details.runas_pw)
sudo_pw_delref(details.runas_pw);
int i;
debug_decl(sudoers_io_close, SUDO_DEBUG_PLUGIN)
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return;
}
{
debug_decl(sudoers_io_version, SUDO_DEBUG_PLUGIN)
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return_bool(-1);
}
gettimeofday(&now, NULL);
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return_bool(-1);
}
static void mysyslog(int, const char *, ...);
static char *new_logline(const char *, int);
-extern sigjmp_buf error_jmp;
-
extern char **NewArgv; /* XXX - for auditing */
#define MAXSYSLOGTRIES 16 /* num of retries for broken syslogs */
/* Exit the plugin. */
sudoers_cleanup(0);
sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
- siglongjmp(error_jmp, 1);
+ plugin_longjmp(1);
}
#define MAX_MAILFLAGS 63
static void _warning(int, const char *, va_list);
void sudoers_cleanup(int);
-sigjmp_buf error_jmp;
+static sigjmp_buf error_jmp;
+static bool setjmp_enabled = false;
extern sudo_conv_t sudo_conv;
_warning(1, fmt, ap);
va_end(ap);
sudoers_cleanup(0);
- if (sudo_conv != NULL)
+ if (setjmp_enabled)
siglongjmp(error_jmp, eval);
else
exit(eval);
_warning(0, fmt, ap);
va_end(ap);
sudoers_cleanup(0);
- if (sudo_conv != NULL)
+ if (setjmp_enabled)
siglongjmp(error_jmp, eval);
else
exit(eval);
{
_warning(1, fmt, ap);
sudoers_cleanup(0);
- if (sudo_conv != NULL)
+ if (setjmp_enabled)
siglongjmp(error_jmp, eval);
else
exit(eval);
{
_warning(0, fmt, ap);
sudoers_cleanup(0);
- if (sudo_conv != NULL)
+ if (setjmp_enabled)
siglongjmp(error_jmp, eval);
else
exit(eval);
{
sudoers_setlocale(oldlocale, NULL);
}
+
+int
+plugin_setjmp(void)
+{
+ setjmp_enabled = true;
+ return sigsetjmp(error_jmp, 1);
+}
+
+void
+plugin_longjmp(int val)
+{
+ siglongjmp(error_jmp, val);
+}
+
+void
+plugin_clearjmp(void)
+{
+ setjmp_enabled = false;
+}
extern char *login_style;
#endif /* HAVE_BSD_AUTH_H */
-extern sigjmp_buf error_jmp;
-
/*
* Deserialize args, settings and user_info arrays.
* Fills in struct sudo_user and other common sudoers state.
if (sudo_version < SUDO_API_MKVERSION(1, 2))
args = NULL;
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
rewind_perms();
+ plugin_clearjmp();
debug_return_bool(-1);
}
{
debug_decl(sudoers_policy_close, SUDO_DEBUG_PLUGIN)
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return;
}
if (sudo_version < SUDO_API_MKVERSION(1, 2))
user_env = NULL;
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* called via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return_bool(-1);
}
debug_decl(sudoers_policy_invalidate, SUDO_DEBUG_PLUGIN)
user_cmnd = "kill";
- if (sigsetjmp(error_jmp, 1) == 0) {
+ if (plugin_setjmp() == 0) {
remove_timestamp(remove);
sudoers_cleanup(0);
}
+ plugin_clearjmp();
debug_return;
}
{
debug_decl(sudoers_policy_version, SUDO_DEBUG_PLUGIN)
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* error recovery via error(), errorx() or log_fatal() */
+ plugin_clearjmp();
debug_return_bool(-1);
}
(void) sigaction(SIGTSTP, &sa, &saved_sa_tstp);
/* XXX - would like to move this to policy.c but need the cleanup. */
- if (sigsetjmp(error_jmp, 1)) {
+ if (plugin_setjmp() != 0) {
/* error recovery via error(), errorx() or log_fatal() */
rval = -1;
goto done;
rval = false;
done:
+ plugin_clearjmp();
rewind_perms();
/* Restore signal handlers before we exec. */
#define _SUDO_SUDOERS_H
#include <limits.h>
-#include <setjmp.h>
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#else
int sudo_setgroups(int ngids, const GETGROUPS_T *gids);
/* plugin_error.c */
-extern sigjmp_buf error_jmp;
+int plugin_setjmp(void);
+void plugin_clearjmp(void);
+void plugin_longjmp(int val) __attribute__((__noreturn__));
#ifndef _SUDO_MAIN
extern struct sudo_user sudo_user;