Fix potential access of an invalid waiter queue.

This commit is contained in:
Sönke Ludwig 2020-05-19 22:52:23 +02:00
parent 2f03f8dd42
commit 1f9a99a805

View file

@ -114,6 +114,10 @@ final class PosixEventDriverEvents(Loop : PosixEventLoop, Sockets : EventDriverS
{ {
if (!isValid(event)) return; if (!isValid(event)) return;
// make sure the event stays alive until all waiters have been notified.
addRef(event);
scope (exit) releaseRef(event);
auto slot = getSlot(event); auto slot = getSlot(event);
if (notify_all) { if (notify_all) {
//log("emitting only for this thread (%s waiters)", m_fds[event].waiters.length); //log("emitting only for this thread (%s waiters)", m_fds[event].waiters.length);
@ -167,9 +171,12 @@ final class PosixEventDriverEvents(Loop : PosixEventLoop, Sockets : EventDriverS
trigger(event, cnt > 0); trigger(event, cnt > 0);
} }
} else { } else {
private void onSocketData(DatagramSocketFD s, IOStatus, size_t, scope RefAddress) private void onSocketData(DatagramSocketFD s, IOStatus st, size_t, scope RefAddress)
@nogc { @nogc {
// avoid infinite recursion in case of errors
if (st == IOStatus.ok)
m_sockets.receiveNoGC(s, m_buf, IOMode.once, &onSocketData); m_sockets.receiveNoGC(s, m_buf, IOMode.once, &onSocketData);
try { try {
EventID evt = m_sockets.userData!EventID(s); EventID evt = m_sockets.userData!EventID(s);
scope doit = { scope doit = {