Do not allow the same callback function to be registered more that
once in fatal_callback_register(). Add fatal_callback_deregister() to deregister a callback.
This commit is contained in:
@@ -168,11 +168,21 @@ _warning(int use_errno, const char *fmt, va_list ap)
|
|||||||
errno = serrno;
|
errno = serrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register a callback to be run when fatal()/fatalx() is called.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
fatal_callback_register(void (*func)(void))
|
fatal_callback_register(void (*func)(void))
|
||||||
{
|
{
|
||||||
struct sudo_fatal_callback *cb;
|
struct sudo_fatal_callback *cb;
|
||||||
|
|
||||||
|
/* Do not register the same callback twice. */
|
||||||
|
SLIST_FOREACH(cb, &callbacks, entries) {
|
||||||
|
if (func == cb->func)
|
||||||
|
return -1; /* dupe! */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate and insert new callback. */
|
||||||
cb = malloc(sizeof(*cb));
|
cb = malloc(sizeof(*cb));
|
||||||
if (cb == NULL)
|
if (cb == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -182,6 +192,29 @@ fatal_callback_register(void (*func)(void))
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deregister a fatal()/fatalx() callback.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
fatal_callback_deregister(void (*func)(void))
|
||||||
|
{
|
||||||
|
struct sudo_fatal_callback *cb, **prev;
|
||||||
|
|
||||||
|
/* Search for callback and remove if found, dupes are not allowed. */
|
||||||
|
SLIST_FOREACH_PREVPTR(cb, prev, &callbacks, entries) {
|
||||||
|
if (cb->func == func) {
|
||||||
|
if (cb == SLIST_FIRST(&callbacks))
|
||||||
|
SLIST_REMOVE_HEAD(&callbacks, entries);
|
||||||
|
else
|
||||||
|
SLIST_REMOVE_AFTER(*prev, entries);
|
||||||
|
free(cb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fatal_disable_setjmp(void)
|
fatal_disable_setjmp(void)
|
||||||
{
|
{
|
||||||
|
@@ -119,6 +119,7 @@
|
|||||||
extern int (*sudo_printf)(int msg_type, const char *fmt, ...);
|
extern int (*sudo_printf)(int msg_type, const char *fmt, ...);
|
||||||
extern sigjmp_buf fatal_jmp;
|
extern sigjmp_buf fatal_jmp;
|
||||||
|
|
||||||
|
int fatal_callback_deregister(void (*func)(void));
|
||||||
int fatal_callback_register(void (*func)(void));
|
int fatal_callback_register(void (*func)(void));
|
||||||
char *warning_gettext(const char *msgid) __format_arg(1);
|
char *warning_gettext(const char *msgid) __format_arg(1);
|
||||||
void fatal_disable_setjmp(void);
|
void fatal_disable_setjmp(void);
|
||||||
|
@@ -576,6 +576,9 @@ sudoers_policy_close(int exit_status, int error_code)
|
|||||||
if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT))
|
if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT))
|
||||||
(void)sudo_auth_end_session(runas_pw);
|
(void)sudo_auth_end_session(runas_pw);
|
||||||
|
|
||||||
|
/* Deregister the callback for fatal()/fatalx(). */
|
||||||
|
fatal_callback_deregister(sudoers_cleanup);
|
||||||
|
|
||||||
/* Free remaining references to password and group entries. */
|
/* Free remaining references to password and group entries. */
|
||||||
/* XXX - move cleanup to function in sudoers.c */
|
/* XXX - move cleanup to function in sudoers.c */
|
||||||
sudo_pw_delref(sudo_user.pw);
|
sudo_pw_delref(sudo_user.pw);
|
||||||
|
Reference in New Issue
Block a user