diff --git a/bufferevent_openssl.c b/bufferevent_openssl.c index 6e9c99f861..2f07cb6bfd 100644 --- a/bufferevent_openssl.c +++ b/bufferevent_openssl.c @@ -934,11 +934,12 @@ be_openssl_readeventcb(evutil_socket_t fd, short what, void *ptr) { struct bufferevent_openssl *bev_ssl = ptr; bufferevent_incref_and_lock_(&bev_ssl->bev.bev); - if (what & EV_TIMEOUT) { + if (what == EV_TIMEOUT) { bufferevent_run_eventcb_(&bev_ssl->bev.bev, BEV_EVENT_TIMEOUT|BEV_EVENT_READING); - } else + } else { consider_reading(bev_ssl); + } bufferevent_decref_and_unlock_(&bev_ssl->bev.bev); } @@ -947,11 +948,12 @@ be_openssl_writeeventcb(evutil_socket_t fd, short what, void *ptr) { struct bufferevent_openssl *bev_ssl = ptr; bufferevent_incref_and_lock_(&bev_ssl->bev.bev); - if (what & EV_TIMEOUT) { + if (what == EV_TIMEOUT) { bufferevent_run_eventcb_(&bev_ssl->bev.bev, BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING); + } else { + consider_writing(bev_ssl); } - consider_writing(bev_ssl); bufferevent_decref_and_unlock_(&bev_ssl->bev.bev); } diff --git a/bufferevent_sock.c b/bufferevent_sock.c index e1fcadc6d4..eaaf9414e8 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -134,6 +134,9 @@ bufferevent_readcb(evutil_socket_t fd, short event, void *arg) bufferevent_incref_and_lock_(bufev); if (event == EV_TIMEOUT) { + /* Note that we only check for event==EV_TIMEOUT. If + * event==EV_TIMEOUT|EV_READ, we can safely ignore the + * timeout, since a read has occurred */ what |= BEV_EVENT_TIMEOUT; goto error; } @@ -210,6 +213,9 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg) bufferevent_incref_and_lock_(bufev); if (event == EV_TIMEOUT) { + /* Note that we only check for event==EV_TIMEOUT. If + * event==EV_TIMEOUT|EV_WRITE, we can safely ignore the + * timeout, since a read has occurred */ what |= BEV_EVENT_TIMEOUT; goto error; }