From: Wouter Wijngaards Date: Tue, 9 Oct 2007 12:04:13 +0000 (+0000) Subject: Fixup event callback checks. X-Git-Tag: release-0.6~73 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a5ac86f4108aa2dd5f2d170ccd7780798d950c4e;p=thirdparty%2Funbound.git Fixup event callback checks. git-svn-id: file:///svn/unbound/trunk@671 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 8f87fd895..9bd8ddf38 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -2,6 +2,9 @@ - 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 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 - function pointer whitelist. diff --git a/util/mini_event.c b/util/mini_event.c index 3b91e14c8..36b995a52 100644 --- a/util/mini_event.c +++ b/util/mini_event.c @@ -45,6 +45,7 @@ #ifdef USE_MINI_EVENT #include #include "util/mini_event.h" +#include "util/fptr_wlist.h" /** compare events in tree, based on timevalue, ptr for uniqueness */ 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 */ (void)rbtree_delete(base->times, p); p->ev_events &= ~EV_TIMEOUT; + log_assert(fptr_whitelist_event(p->ev_callback)); (*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; if(bits) { + log_assert(fptr_whitelist_event( + base->fds[i]->ev_callback)); (*base->fds[i]->ev_callback)(base->fds[i]->ev_fd, bits, base->fds[i]->ev_arg); if(ret==0) @@ -238,6 +242,7 @@ void event_set(struct event* ev, int fd, short bits, ev->ev_fd = fd; ev->ev_events = bits; ev->ev_callback = cb; + log_assert(fptr_whitelist_event(ev->ev_callback)); ev->ev_arg = arg; ev->added = 0; } @@ -311,6 +316,7 @@ static RETSIGTYPE sigh(int sig) ev = signal_base->signals[sig]; if(!ev) return; + log_assert(fptr_whitelist_event(ev->ev_callback)); (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg); } diff --git a/util/netevent.c b/util/netevent.c index 404dc6111..df3882760 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -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, (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 */ @@ -264,8 +262,6 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg) } /* addr is dropped. Not needed for tcp reply. */ 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 */ @@ -468,8 +464,6 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg) NETEVENT_CLOSED, NULL); } } - /* may be deleted - log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */ return; } if(event&EV_WRITE) { @@ -482,8 +476,6 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg) NETEVENT_CLOSED, NULL); } } - /* - log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */ return; } 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, NETEVENT_TIMEOUT, NULL); } - /* - log_assert(fptr_whitelist_event(c->ev->ev.ev_callback)); */ return; } 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) @@ -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, NULL); } - /* log_assert(fptr_whitelist_event(c->ev->ev.ev_callback));*/ return; } log_err("Ignored event %d for localhdl.", event); - /*log_assert(fptr_whitelist_event(c->ev->ev.ev_callback));*/ } struct comm_point* @@ -1044,7 +1030,6 @@ comm_timer_callback(int ATTR_UNUSED(fd), short event, void* arg) tm->ev_timer->enabled = 0; log_assert(fptr_whitelist_comm_timer(tm->callback)); (*tm->callback)(tm->cb_arg); - /* it was deleted log_assert(fptr_whitelist_event(tm->ev_timer->ev.ev_callback)); */ } int @@ -1084,7 +1069,6 @@ comm_signal_callback(int sig, short event, void* arg) return; log_assert(fptr_whitelist_comm_signal(comsig->callback)); (*comsig->callback)(sig, comsig->cb_arg); - /*log_assert(fptr_whitelist_event(comsig->ev_signal->ev.ev_callback));*/ } int