Fixup event callback checks.

git-svn-id: file:///svn/unbound/trunk@671 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-10-09 12:04:13 +00:00
parent aed61e4d8a
commit a5ac86f410
3 changed files with 9 additions and 16 deletions

View file

@ -2,6 +2,9 @@
- removed logfile open early. It did not have the proper permissions; - removed logfile open early. It did not have the proper permissions;
it was opened as root instead of the user. And we cannot change user it was opened as root instead of the user. And we cannot change user
id yet, since chroot and bind ports need to be done. id yet, since chroot and bind ports need to be done.
- callback checks for event callbacks done from mini_event. Because
of deletions cannot do this from netevent. This means when using
libevent the protection does not work on event-callbacks.
5 October 2007: Wouter 5 October 2007: Wouter
- function pointer whitelist. - function pointer whitelist.

View file

@ -45,6 +45,7 @@
#ifdef USE_MINI_EVENT #ifdef USE_MINI_EVENT
#include <signal.h> #include <signal.h>
#include "util/mini_event.h" #include "util/mini_event.h"
#include "util/fptr_wlist.h"
/** compare events in tree, based on timevalue, ptr for uniqueness */ /** compare events in tree, based on timevalue, ptr for uniqueness */
int mini_ev_cmp(const void* a, const void* b) int mini_ev_cmp(const void* a, const void* b)
@ -145,6 +146,7 @@ static void handle_timeouts(struct event_base* base, struct timeval* now,
/* event times out, remove it */ /* event times out, remove it */
(void)rbtree_delete(base->times, p); (void)rbtree_delete(base->times, p);
p->ev_events &= ~EV_TIMEOUT; p->ev_events &= ~EV_TIMEOUT;
log_assert(fptr_whitelist_event(p->ev_callback));
(*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg); (*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg);
} }
} }
@ -181,6 +183,8 @@ static int handle_select(struct event_base* base, struct timeval* wait)
} }
bits &= base->fds[i]->ev_events; bits &= base->fds[i]->ev_events;
if(bits) { if(bits) {
log_assert(fptr_whitelist_event(
base->fds[i]->ev_callback));
(*base->fds[i]->ev_callback)(base->fds[i]->ev_fd, (*base->fds[i]->ev_callback)(base->fds[i]->ev_fd,
bits, base->fds[i]->ev_arg); bits, base->fds[i]->ev_arg);
if(ret==0) if(ret==0)
@ -238,6 +242,7 @@ void event_set(struct event* ev, int fd, short bits,
ev->ev_fd = fd; ev->ev_fd = fd;
ev->ev_events = bits; ev->ev_events = bits;
ev->ev_callback = cb; ev->ev_callback = cb;
log_assert(fptr_whitelist_event(ev->ev_callback));
ev->ev_arg = arg; ev->ev_arg = arg;
ev->added = 0; ev->added = 0;
} }
@ -311,6 +316,7 @@ static RETSIGTYPE sigh(int sig)
ev = signal_base->signals[sig]; ev = signal_base->signals[sig];
if(!ev) if(!ev)
return; return;
log_assert(fptr_whitelist_event(ev->ev_callback));
(*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg); (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg);
} }

View file

@ -206,8 +206,6 @@ comm_point_udp_callback(int fd, short event, void* arg)
(void)comm_point_send_udp_msg(rep.c, rep.c->buffer, (void)comm_point_send_udp_msg(rep.c, rep.c->buffer,
(struct sockaddr*)&rep.addr, rep.addrlen); (struct sockaddr*)&rep.addr, rep.addrlen);
} }
/* may be deleted
log_assert(fptr_whitelist_event(rep.c->ev->ev.ev_callback)); */
} }
/** Use a new tcp handler for new query fd, set to read query */ /** Use a new tcp handler for new query fd, set to read query */
@ -264,8 +262,6 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg)
} }
/* addr is dropped. Not needed for tcp reply. */ /* addr is dropped. Not needed for tcp reply. */
setup_tcp_handler(c_hdl, new_fd); setup_tcp_handler(c_hdl, new_fd);
/* may be deleted
log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */
} }
/** Make tcp handler free for next assignment */ /** Make tcp handler free for next assignment */
@ -468,8 +464,6 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
NETEVENT_CLOSED, NULL); NETEVENT_CLOSED, NULL);
} }
} }
/* may be deleted
log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */
return; return;
} }
if(event&EV_WRITE) { if(event&EV_WRITE) {
@ -482,8 +476,6 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
NETEVENT_CLOSED, NULL); NETEVENT_CLOSED, NULL);
} }
} }
/*
log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */
return; return;
} }
if(event&EV_TIMEOUT) { if(event&EV_TIMEOUT) {
@ -494,13 +486,9 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
(void)(*c->callback)(c, c->cb_arg, (void)(*c->callback)(c, c->cb_arg,
NETEVENT_TIMEOUT, NULL); NETEVENT_TIMEOUT, NULL);
} }
/*
log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */
return; return;
} }
log_err("Ignored event %d for tcphdl.", event); log_err("Ignored event %d for tcphdl.", event);
/*
log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */
} }
void comm_point_local_handle_callback(int fd, short event, void* arg) void comm_point_local_handle_callback(int fd, short event, void* arg)
@ -514,11 +502,9 @@ void comm_point_local_handle_callback(int fd, short event, void* arg)
(void)(*c->callback)(c, c->cb_arg, NETEVENT_CLOSED, (void)(*c->callback)(c, c->cb_arg, NETEVENT_CLOSED,
NULL); NULL);
} }
/* log_assert(fptr_whitelist_event(c->ev->ev.ev_callback));*/
return; return;
} }
log_err("Ignored event %d for localhdl.", event); log_err("Ignored event %d for localhdl.", event);
/*log_assert(fptr_whitelist_event(c->ev->ev.ev_callback));*/
} }
struct comm_point* struct comm_point*
@ -1044,7 +1030,6 @@ comm_timer_callback(int ATTR_UNUSED(fd), short event, void* arg)
tm->ev_timer->enabled = 0; tm->ev_timer->enabled = 0;
log_assert(fptr_whitelist_comm_timer(tm->callback)); log_assert(fptr_whitelist_comm_timer(tm->callback));
(*tm->callback)(tm->cb_arg); (*tm->callback)(tm->cb_arg);
/* it was deleted log_assert(fptr_whitelist_event(tm->ev_timer->ev.ev_callback)); */
} }
int int
@ -1084,7 +1069,6 @@ comm_signal_callback(int sig, short event, void* arg)
return; return;
log_assert(fptr_whitelist_comm_signal(comsig->callback)); log_assert(fptr_whitelist_comm_signal(comsig->callback));
(*comsig->callback)(sig, comsig->cb_arg); (*comsig->callback)(sig, comsig->cb_arg);
/*log_assert(fptr_whitelist_event(comsig->ev_signal->ev.ev_callback));*/
} }
int int