From b933281ed5efb9ad9375c3ea41ee2412b9f89c15 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Thu, 18 Dec 2008 23:26:08 +0100 Subject: Fixes nasty bug in event processing. WALK_LIST_DELSAFE (in ev_run_list) is not safe with regard to deletion of next node. When some events are rescheduled during event execution, it may lead to deletion of next node and some events are skipped. Such skipped nodes remain in temporary list on stack and the last of them contains 'next' pointer to stack area. When this event is later scheduled, it damages stack area trying to remove it from the list, which leads to random crashes with funny backtraces :-) . --- lib/event.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/event.c') diff --git a/lib/event.c b/lib/event.c index 9b5870d..55a9c48 100644 --- a/lib/event.c +++ b/lib/event.c @@ -125,13 +125,13 @@ ev_schedule(event *e) int ev_run_list(event_list *l) { - node *n, *p; + node *n; list tmp_list; init_list(&tmp_list); add_tail_list(&tmp_list, l); init_list(l); - WALK_LIST_DELSAFE(n, p, tmp_list) + WALK_LIST_FIRST(n, tmp_list) { event *e = SKIP_BACK(event, n, n); ev_run(e); -- cgit v1.2.3