From: Alan T. DeKok Date: Tue, 17 Oct 2017 17:32:07 +0000 (-0400) Subject: clear out el->events[] for an FD when the event is deleted X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc2c439e97c718d9cd70bc4a221065ee3e201ba9;p=thirdparty%2Ffreeradius-server.git clear out el->events[] for an FD when the event is deleted --- diff --git a/src/lib/util/event.c b/src/lib/util/event.c index d99bf1bac44..bf4b50c259d 100644 --- a/src/lib/util/event.c +++ b/src/lib/util/event.c @@ -588,6 +588,7 @@ static int fr_event_fd_type_set(fr_event_fd_t *ef, int fd) */ static int fr_event_fd_delete_internal(fr_event_fd_t *ef) { + int i; struct kevent evset[10]; int count = 0; fr_event_list_t *el; @@ -611,6 +612,19 @@ static int fr_event_fd_delete_internal(fr_event_fd_t *ef) rbtree_deletebydata(el->fds, ef); ef->is_registered = false; + /* + * If there are pending events for this FD, go mark them + * as deleted. + */ + for (i = 0; i < el->num_fd_events; i++) { + if (((el->events[i].filter == EVFILT_READ) || + (el->events[i].filter == EVFILT_WRITE) || + (el->events[i].filter == EVFILT_VNODE)) && + (el->events[i].udata == ef)) { + el->events[i].udata = NULL; + } + } + el->num_fds--; return 0; @@ -1510,6 +1524,11 @@ void fr_event_service(fr_event_list_t *el) continue; } + /* + * Skip events for deleted FDs. + */ + if (!el->events[i].udata) continue; + ef = talloc_get_type_abort(el->events[i].udata, fr_event_fd_t); if (!fr_cond_assert(ef->is_registered)) continue;