Fix tinc event loop reentrancy from timeout handlers.
authorEtienne Dechamps <etienne@edechamps.fr>
Fri, 4 Jul 2014 23:23:05 +0000 (00:23 +0100)
committerEtienne Dechamps <etienne@edechamps.fr>
Sun, 6 Jul 2014 08:41:30 +0000 (09:41 +0100)
commitc786ed116805c0bc911f592c03dc0d5562287283
treea2ed08ece71715d79ea1a1d57ed37da19aa3b150
parentd0d01a44485ee04f60a8fccf9bdf8311e23ffa43
Fix tinc event loop reentrancy from timeout handlers.

Commit 611217c96ec684799882cf330f40a0936131b6b5 introduced a regression
because it accidentally reordered the timeout handler calls and the
fdset setup code. This means that any io_add(), io_del() or io_set()
calls in timeout handlers would be ignored in the current event loop
iteration, resulting in erratic behavior.

The most visible symptom is when a metaconnection timeout occurs and the
connection is closed; the timeout handler closes the socket but it still
ends up in the select() call, typically resulting in the following
crash:

    Error while waiting for input: Bad file descriptor
src/event.c