version 1.1.1.1, 2012/02/21 16:23:02
|
version 1.1.1.2, 2012/05/29 12:26:49
|
Line 91 mysyslog(int pri, const char *fmt, ...)
|
Line 91 mysyslog(int pri, const char *fmt, ...)
|
#endif |
#endif |
char buf[MAXSYSLOGLEN+1]; |
char buf[MAXSYSLOGLEN+1]; |
va_list ap; |
va_list ap; |
|
debug_decl(mysyslog, SUDO_DEBUG_LOGGING) |
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
#ifdef LOG_NFACILITIES |
#ifdef LOG_NFACILITIES |
Line 113 mysyslog(int pri, const char *fmt, ...)
|
Line 114 mysyslog(int pri, const char *fmt, ...)
|
#endif /* BROKEN_SYSLOG */ |
#endif /* BROKEN_SYSLOG */ |
va_end(ap); |
va_end(ap); |
closelog(); |
closelog(); |
|
debug_return; |
} |
} |
|
|
#define FMT_FIRST "%8s : %s" |
#define FMT_FIRST "%8s : %s" |
Line 128 do_syslog(int pri, char *msg)
|
Line 130 do_syslog(int pri, char *msg)
|
size_t len, maxlen; |
size_t len, maxlen; |
char *p, *tmp, save; |
char *p, *tmp, save; |
const char *fmt; |
const char *fmt; |
|
debug_decl(do_syslog, SUDO_DEBUG_LOGGING) |
|
|
#ifdef HAVE_SETLOCALE |
#ifdef HAVE_SETLOCALE |
const char *old_locale = estrdup(setlocale(LC_ALL, NULL)); |
const char *old_locale = estrdup(setlocale(LC_ALL, NULL)); |
Line 174 do_syslog(int pri, char *msg)
|
Line 177 do_syslog(int pri, char *msg)
|
setlocale(LC_ALL, old_locale); |
setlocale(LC_ALL, old_locale); |
efree((void *)old_locale); |
efree((void *)old_locale); |
#endif /* HAVE_SETLOCALE */ |
#endif /* HAVE_SETLOCALE */ |
|
|
|
debug_return; |
} |
} |
|
|
static void |
static void |
Line 184 do_logfile(char *msg)
|
Line 189 do_logfile(char *msg)
|
mode_t oldmask; |
mode_t oldmask; |
time_t now; |
time_t now; |
FILE *fp; |
FILE *fp; |
|
debug_decl(do_logfile, SUDO_DEBUG_LOGGING) |
|
|
oldmask = umask(077); |
oldmask = umask(077); |
fp = fopen(def_logfile, "a"); |
fp = fopen(def_logfile, "a"); |
Line 233 do_logfile(char *msg)
|
Line 239 do_logfile(char *msg)
|
efree((void *)old_locale); |
efree((void *)old_locale); |
#endif /* HAVE_SETLOCALE */ |
#endif /* HAVE_SETLOCALE */ |
} |
} |
|
debug_return; |
} |
} |
|
|
/* |
/* |
Line 241 do_logfile(char *msg)
|
Line 248 do_logfile(char *msg)
|
void |
void |
log_denial(int status, int inform_user) |
log_denial(int status, int inform_user) |
{ |
{ |
char *message; | char *logline, *message; |
char *logline; | debug_decl(log_denial, SUDO_DEBUG_LOGGING) |
|
|
/* Set error message. */ |
/* Set error message. */ |
if (ISSET(status, FLAG_NO_USER)) |
if (ISSET(status, FLAG_NO_USER)) |
Line 289 log_denial(int status, int inform_user)
|
Line 296 log_denial(int status, int inform_user)
|
do_logfile(logline); |
do_logfile(logline); |
|
|
efree(logline); |
efree(logline); |
|
debug_return; |
} |
} |
|
|
/* |
/* |
Line 298 void
|
Line 306 void
|
log_allowed(int status) |
log_allowed(int status) |
{ |
{ |
char *logline; |
char *logline; |
|
debug_decl(log_allowed, SUDO_DEBUG_LOGGING) |
|
|
logline = new_logline(NULL, 0); |
logline = new_logline(NULL, 0); |
|
|
Line 313 log_allowed(int status)
|
Line 322 log_allowed(int status)
|
do_logfile(logline); |
do_logfile(logline); |
|
|
efree(logline); |
efree(logline); |
|
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; |
int serrno = errno; |
char *message; | char *logline, *message; |
char *logline; | debug_decl(vlog_error, SUDO_DEBUG_LOGGING) |
va_list ap; | |
|
|
/* Expand printf-style format + args. */ |
/* Expand printf-style format + args. */ |
va_start(ap, fmt); |
|
evasprintf(&message, fmt, ap); |
evasprintf(&message, fmt, ap); |
va_end(ap); |
|
|
|
/* Become root if we are not already to avoid user interference */ |
/* Become root if we are not already to avoid user interference */ |
set_perms(PERM_ROOT|PERM_NOEXIT); |
set_perms(PERM_ROOT|PERM_NOEXIT); |
Line 366 log_error(int flags, const char *fmt, ...)
|
Line 376 log_error(int flags, const char *fmt, ...)
|
|
|
restore_perms(); |
restore_perms(); |
|
|
if (!ISSET(flags, NO_EXIT)) { | debug_return; |
plugin_cleanup(0); | |
siglongjmp(error_jmp, 1); | |
} | |
} |
} |
|
|
|
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 |
#define MAX_MAILFLAGS 63 |
|
|
/* |
/* |
Line 396 send_mail(const char *fmt, ...)
|
Line 434 send_mail(const char *fmt, ...)
|
NULL |
NULL |
}; |
}; |
#endif /* NO_ROOT_MAILER */ |
#endif /* NO_ROOT_MAILER */ |
|
debug_decl(send_mail, SUDO_DEBUG_LOGGING) |
|
|
/* Just return if mailer is disabled. */ |
/* Just return if mailer is disabled. */ |
if (!def_mailerpath || !def_mailto) |
if (!def_mailerpath || !def_mailto) |
return; | debug_return; |
|
|
/* Fork and return, child will daemonize. */ |
/* Fork and return, child will daemonize. */ |
switch (pid = fork()) { | switch (pid = sudo_debug_fork()) { |
case -1: |
case -1: |
/* Error. */ |
/* Error. */ |
error(1, _("unable to fork")); |
error(1, _("unable to fork")); |
Line 413 send_mail(const char *fmt, ...)
|
Line 452 send_mail(const char *fmt, ...)
|
case -1: |
case -1: |
/* Error. */ |
/* Error. */ |
mysyslog(LOG_ERR, _("unable to fork: %m")); |
mysyslog(LOG_ERR, _("unable to fork: %m")); |
|
sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to fork: %s", |
|
strerror(errno)); |
_exit(1); |
_exit(1); |
case 0: |
case 0: |
/* Grandchild continues below. */ |
/* Grandchild continues below. */ |
Line 427 send_mail(const char *fmt, ...)
|
Line 468 send_mail(const char *fmt, ...)
|
do { |
do { |
rv = waitpid(pid, &status, 0); |
rv = waitpid(pid, &status, 0); |
} while (rv == -1 && errno == EINTR); |
} while (rv == -1 && errno == EINTR); |
return; | return; /* not debug */ |
} |
} |
|
|
/* Daemonize - disassociate from session/tty. */ |
/* Daemonize - disassociate from session/tty. */ |
Line 463 send_mail(const char *fmt, ...)
|
Line 504 send_mail(const char *fmt, ...)
|
|
|
if (pipe(pfd) == -1) { |
if (pipe(pfd) == -1) { |
mysyslog(LOG_ERR, _("unable to open pipe: %m")); |
mysyslog(LOG_ERR, _("unable to open pipe: %m")); |
|
sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to open pipe: %s", |
|
strerror(errno)); |
|
sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); |
_exit(1); |
_exit(1); |
} |
} |
|
|
switch (pid = fork()) { | switch (pid = sudo_debug_fork()) { |
case -1: |
case -1: |
/* Error. */ |
/* Error. */ |
mysyslog(LOG_ERR, _("unable to fork: %m")); |
mysyslog(LOG_ERR, _("unable to fork: %m")); |
|
sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to fork: %s", |
|
strerror(errno)); |
|
sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); |
_exit(1); |
_exit(1); |
break; |
break; |
case 0: |
case 0: |
Line 482 send_mail(const char *fmt, ...)
|
Line 529 send_mail(const char *fmt, ...)
|
if (pfd[0] != STDIN_FILENO) { |
if (pfd[0] != STDIN_FILENO) { |
if (dup2(pfd[0], STDIN_FILENO) == -1) { |
if (dup2(pfd[0], STDIN_FILENO) == -1) { |
mysyslog(LOG_ERR, _("unable to dup stdin: %m")); |
mysyslog(LOG_ERR, _("unable to dup stdin: %m")); |
|
sudo_debug_printf(SUDO_DEBUG_ERROR, |
|
"unable to dup stdin: %s", strerror(errno)); |
_exit(127); |
_exit(127); |
} |
} |
(void) close(pfd[0]); |
(void) close(pfd[0]); |
Line 516 send_mail(const char *fmt, ...)
|
Line 565 send_mail(const char *fmt, ...)
|
execv(mpath, argv); |
execv(mpath, argv); |
#endif /* NO_ROOT_MAILER */ |
#endif /* NO_ROOT_MAILER */ |
mysyslog(LOG_ERR, _("unable to execute %s: %m"), mpath); |
mysyslog(LOG_ERR, _("unable to execute %s: %m"), mpath); |
|
sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to execute %s: %s", |
|
mpath, strerror(errno)); |
_exit(127); |
_exit(127); |
} |
} |
break; |
break; |
Line 561 send_mail(const char *fmt, ...)
|
Line 612 send_mail(const char *fmt, ...)
|
do { |
do { |
rv = waitpid(pid, &status, 0); |
rv = waitpid(pid, &status, 0); |
} while (rv == -1 && errno == EINTR); |
} while (rv == -1 && errno == EINTR); |
|
sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); |
_exit(0); |
_exit(0); |
} |
} |
|
|
Line 570 send_mail(const char *fmt, ...)
|
Line 622 send_mail(const char *fmt, ...)
|
static int |
static int |
should_mail(int status) |
should_mail(int status) |
{ |
{ |
|
debug_decl(should_mail, SUDO_DEBUG_LOGGING) |
|
|
return def_mail_always || ISSET(status, VALIDATE_ERROR) || | debug_return_bool(def_mail_always || ISSET(status, VALIDATE_ERROR) || |
(def_mail_no_user && ISSET(status, FLAG_NO_USER)) || |
(def_mail_no_user && ISSET(status, FLAG_NO_USER)) || |
(def_mail_no_host && ISSET(status, FLAG_NO_HOST)) || |
(def_mail_no_host && ISSET(status, FLAG_NO_HOST)) || |
(def_mail_no_perms && !ISSET(status, VALIDATE_OK)); | (def_mail_no_perms && !ISSET(status, VALIDATE_OK))); |
} |
} |
|
|
#define LL_TTY_STR "TTY=" |
#define LL_TTY_STR "TTY=" |
Line 603 new_logline(const char *message, int serrno)
|
Line 656 new_logline(const char *message, int serrno)
|
char *errstr = NULL; |
char *errstr = NULL; |
char *evstr = NULL; |
char *evstr = NULL; |
char *line, sessid[7], *tsid = NULL; |
char *line, sessid[7], *tsid = NULL; |
|
debug_decl(new_logline, SUDO_DEBUG_LOGGING) |
|
|
/* A TSID may be a sudoers-style session ID or a free-form string. */ |
/* A TSID may be a sudoers-style session ID or a free-form string. */ |
if (sudo_user.iolog_file != NULL) { |
if (sudo_user.iolog_file != NULL) { |
Line 723 new_logline(const char *message, int serrno)
|
Line 777 new_logline(const char *message, int serrno)
|
} |
} |
} |
} |
|
|
return line; | debug_return_str(line); |
toobig: |
toobig: |
errorx(1, _("internal error: insufficient space for log line")); |
errorx(1, _("internal error: insufficient space for log line")); |
} |
} |