]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
clear out el->events[] for an FD when the event is deleted
authorAlan T. DeKok <aland@freeradius.org>
Tue, 17 Oct 2017 17:32:07 +0000 (13:32 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 17 Oct 2017 17:32:07 +0000 (13:32 -0400)
src/lib/util/event.c

index d99bf1bac448f3028059a84b4797841336a9dbb5..bf4b50c259d610d446993b8ac890734aa0025dc3 100644 (file)
@@ -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;