From e1c1bb8b1bacce82c58e133fd34182e5166b38f0 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 22 Jan 2023 13:02:00 -0800 Subject: [PATCH] dbEvent: correct eventsRemaining Only pass eventsRemaining when no queued events have been canceled. Also possible race bt accessing ev_que with locking. --- modules/database/src/ioc/db/dbEvent.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/database/src/ioc/db/dbEvent.c b/modules/database/src/ioc/db/dbEvent.c index 5891c0afe..4fd4fde06 100644 --- a/modules/database/src/ioc/db/dbEvent.c +++ b/modules/database/src/ioc/db/dbEvent.c @@ -955,6 +955,7 @@ static int event_read ( struct event_que *ev_que ) while ( ev_que->evque[ev_que->getix] != EVENTQEMPTY ) { struct evSubscrip *pevent = ev_que->evque[ev_que->getix]; + int eventsRemaining; pfl = ev_que->valque[ev_que->getix]; if ( pevent == &canceledEvent ) { @@ -977,6 +978,7 @@ static int event_read ( struct event_que *ev_que ) event_remove ( ev_que, ev_que->getix, EVENTQEMPTY ); ev_que->getix = RNGINC ( ev_que->getix ); + eventsRemaining = ev_que->evque[ev_que->getix] != EVENTQEMPTY && !ev_que->nCanceled; /* * create a local copy of the call back parameters while @@ -1009,7 +1011,7 @@ static int event_read ( struct event_que *ev_que ) if (pfl) { /* Issue user callback */ ( *user_sub ) ( pevent->user_arg, pevent->chan, - ev_que->evque[ev_que->getix] != EVENTQEMPTY, pfl ); + eventsRemaining, pfl ); } LOCKEVQUE (ev_que);