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:
Nick Mathewson 2011-12-05 15:02:27 -05:00
parent ba4d66961e
commit 11f36a5f76

View File

@ -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;
}
}
}