mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-13 14:26:30 -04:00
Be absolutely sure to clear pncalls before leaving event_signal_closure
I thought we'd fixed the cases where this could come up, but apparently having an event_base_break() happen while processing signal events could get us in trouble. Found by Remi Gacogne. Sourceforge issue 3451433 .
This commit is contained in:
parent
ba4d66961e
commit
11f36a5f76
8
event.c
8
event.c
@ -1038,7 +1038,8 @@ event_signal_closure(struct event_base *base, struct event *ev)
|
||||
|
||||
/* Allows deletes to work */
|
||||
ncalls = ev->ev_ncalls;
|
||||
ev->ev_pncalls = &ncalls;
|
||||
if (ncalls != 0)
|
||||
ev->ev_pncalls = &ncalls;
|
||||
EVBASE_RELEASE_LOCK(base, th_base_lock);
|
||||
while (ncalls) {
|
||||
ncalls--;
|
||||
@ -1051,8 +1052,11 @@ event_signal_closure(struct event_base *base, struct event *ev)
|
||||
should_break = base->event_break;
|
||||
EVBASE_RELEASE_LOCK(base, th_base_lock);
|
||||
|
||||
if (should_break)
|
||||
if (should_break) {
|
||||
if (ncalls != 0)
|
||||
ev->ev_pncalls = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user