From 9dee36bc8b72be6c00089af857c1d119886c3ed7 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 16 Nov 2012 18:34:43 -0500 Subject: [PATCH] Make bufferevent_set_timeouts(bev, NULL, NULL) have plausible semantics --- bufferevent_openssl.c | 23 +++++++++++++++++------ bufferevent_sock.c | 19 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/bufferevent_openssl.c b/bufferevent_openssl.c index 55173d928d..99ed5f8d68 100644 --- a/bufferevent_openssl.c +++ b/bufferevent_openssl.c @@ -1221,14 +1221,25 @@ be_openssl_adj_timeouts(struct bufferevent *bev) { struct bufferevent_openssl *bev_ssl = upcast(bev); - if (bev_ssl->underlying) + if (bev_ssl->underlying) { return bufferevent_generic_adj_timeouts_(bev); - else { + } else { int r1=0, r2=0; - if (event_pending(&bev->ev_read, EV_READ, NULL)) - r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read); - if (event_pending(&bev->ev_write, EV_WRITE, NULL)) - r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write); + if (event_pending(&bev->ev_read, EV_READ, NULL)) { + if (evutil_timerisset(&bev->timeout_read)) { + r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read); + } else { + event_remove_timer(&bev->ev_read); + } + } + if (event_pending(&bev->ev_write, EV_WRITE, NULL)) { + if (evutil_timerisset(&bev->timeout_write)) { + r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write); + } else { + event_remove_timer(&bev->ev_write); + } + } + return (r1<0 || r2<0) ? -1 : 0; } } diff --git a/bufferevent_sock.c b/bufferevent_sock.c index eaaf9414e8..5a85743dbf 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -600,12 +600,21 @@ static int be_socket_adj_timeouts(struct bufferevent *bufev) { int r = 0; - if (event_pending(&bufev->ev_read, EV_READ, NULL)) - if (be_socket_add(&bufev->ev_read, &bufev->timeout_read) < 0) - r = -1; + if (event_pending(&bufev->ev_read, EV_READ, NULL)) { + if (evutil_timerisset(&bufev->timeout_read)) { + if (be_socket_add(&bufev->ev_read, &bufev->timeout_read) < 0) + r = -1; + } else { + event_remove_timer(&bufev->ev_read); + } + } if (event_pending(&bufev->ev_write, EV_WRITE, NULL)) { - if (be_socket_add(&bufev->ev_write, &bufev->timeout_write) < 0) - r = -1; + if (evutil_timerisset(&bufev->timeout_write)) { + if (be_socket_add(&bufev->ev_write, &bufev->timeout_write) < 0) + r = -1; + } else { + event_remove_timer(&bufev->ev_write); + } } return r; }