From: Alan T. DeKok Date: Tue, 17 Oct 2017 18:18:22 +0000 (-0400) Subject: more than one NOTE can be returned X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=229ee983c81f24cc2a06c7b07e4a4f7ff70dd461;p=thirdparty%2Ffreeradius-server.git more than one NOTE can be returned --- diff --git a/src/lib/util/event.c b/src/lib/util/event.c index bf4b50c259d..bb65bf28e94 100644 --- a/src/lib/util/event.c +++ b/src/lib/util/event.c @@ -1603,42 +1603,54 @@ service: case FR_EVENT_FILTER_VNODE: if (unlikely(!fr_cond_assert(el->events[i].filter == EVFILT_VNODE))) break; - switch (el->events[i].fflags) { - case NOTE_DELETE: + if ((el->events[i].fflags & NOTE_DELETE) != 0) { ef->active.vnode.delete(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_DELETE; + } - case NOTE_WRITE: + if ((el->events[i].fflags & NOTE_WRITE) != 0) { ef->active.vnode.write(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_WRITE; + } - case NOTE_EXTEND: + if ((el->events[i].fflags & NOTE_EXTEND) != 0) { ef->active.vnode.extend(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_EXTEND; + } - case NOTE_ATTRIB: + if ((el->events[i].fflags & NOTE_ATTRIB) != 0) { ef->active.vnode.attrib(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_ATTRIB; + } - case NOTE_LINK: - ef->active.vnode.link(el, ef->fd, flags, ef->uctx); - break; + /* + * NOTE_LINK is sometimes added even if we didn't ask for it. + */ + if ((el->events[i].fflags & NOTE_LINK) != 0) { + if (ef->active.vnode.link) ef->active.vnode.link(el, ef->fd, flags, ef->uctx); + el->events[i].fflags &= ~NOTE_LINK; + } - case NOTE_RENAME: + if ((el->events[i].fflags & NOTE_RENAME) != 0) { ef->active.vnode.rename(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_RENAME; + } + #ifdef NOTE_REVOKE - case NOTE_REVOKE: + if ((el->events[i].fflags & NOTE_REVOKE) != 0) { ef->active.vnode.revoke(el, ef->fd, flags, ef->uctx); - break; + el->events[i].fflags &= ~NOTE_REVOKE; + } #endif + #ifdef NOTE_FUNLOCK - case NOTE_FUNLOCK: + if ((el->events[i].fflags & NOTE_FUNLOCK) != 0) { ef->active.vnode.funlock(el, ef->fd, flags, ef->uctx); -#endif - default: - if (unlikely(!fr_cond_assert(false))) break; + el->events[i].fflags &= ~NOTE_FUNLOCK; } +#endif + + if (el->events[i].fflags && unlikely(!fr_cond_assert(false))) break; break; default: