From d401ecbd70e02ad5b0cd7ab103359a23c6af3224 Mon Sep 17 00:00:00 2001 From: Linus Nordberg Date: Mon, 18 Nov 2013 15:30:00 +0100 Subject: [PATCH] Disable/delete events in the timeout callback. Without this, the sequence (1) send (successfully) (2) receive (timeout) (3) resend (successfully) will have the read event from (2) trigger a read in (3) and the response is lost. Addresses LIBRADSEC-3. --- lib/event.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/event.c b/lib/event.c index c625850..b572184 100644 --- a/lib/event.c +++ b/lib/event.c @@ -92,6 +92,21 @@ event_retransmit_timeout_cb (int fd, short event, void *data) rs_debug (("%s: retransmission timeout on %p (fd %d) sending to %p\n", __func__, conn, conn->fd, conn->active_peer)); rs_err_conn_push_fl (conn, RSE_TIMEOUT_IO, __FILE__, __LINE__, NULL); + + /* Disable/delete read and write events. Timing out on reading + might f.ex. trigger resending of a message. It'd be + surprising to end up reading without having enabled/created a + read event in that case. */ + if (conn->bev) /* TCP. */ + bufferevent_disable (conn->bev, EV_WRITE|EV_READ); + else /* UDP. */ + { + if (conn->wev) + event_del (conn->wev); + if (conn->rev) + event_del (conn->rev); + } + event_loopbreak (conn); } } -- 2.1.4