Module Name: src Committed By: kamil Date: Wed May 31 00:45:59 UTC 2017
Modified Files: src/sys/sys: event.h Log Message: Convert EV_SET from macro to static __inline function LLDB introduced support for kevent(2) and it contains the following function: Status MainLoop::RunImpl::Poll() { in_events.resize(loop.m_read_fds.size()); unsigned i = 0; for (auto &fd : loop.m_read_fds) EV_SET(&in_events[i++], fd.first, EVFILT_READ, EV_ADD, 0, 0, 0); num_events = kevent(loop.m_kqueue, in_events.data(), in_events.size(), out_events, llvm::array_lengthof(out_events), nullptr); if (num_events < 0) return Status("kevent() failed with error %d\n", num_events); return Status(); } It works on FreeBSD and MacOSX, however it broke on NetBSD. Culrpit line: EV_SET(&in_events[i++], fd.first, EVFILT_READ, EV_ADD, 0, 0, 0); FreeBSD defined EV_SET() as a macro this way: #define EV_SET(kevp_, a, b, c, d, e, f) do { \ struct kevent *kevp = (kevp_); \ (kevp)->ident = (a); \ (kevp)->filter = (b); \ (kevp)->flags = (c); \ (kevp)->fflags = (d); \ (kevp)->data = (e); \ (kevp)->udata = (f); \ } while(0) NetBSD version was different: #define EV_SET(kevp, a, b, c, d, e, f) \ do { \ (kevp)->ident = (a); \ (kevp)->filter = (b); \ (kevp)->flags = (c); \ (kevp)->fflags = (d); \ (kevp)->data = (e); \ (kevp)->udata = (f); \ } while (/* CONSTCOND */ 0) This resulted in heap damage, as keyp was incremented every time value was assigned to (keyp)->. As suggested by Joerg, convert this macro on NetBSD to static __inline function. Credit to <coypu> for asan+ubsan research wiki entry that helped to narrow down the bug. Credit to <joerg> for peer-review Sponsored by <The NetBSD Foundation> To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/sys/event.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.