Don't discard SSL read event when timeout and read come close together

This commit is contained in:
Nick Mathewson 2012-09-07 15:53:02 -04:00
parent 484e93c1d0
commit 576b29f21b
2 changed files with 12 additions and 4 deletions

View File

@ -925,11 +925,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);
}
@ -938,11 +939,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);
}

View File

@ -133,6 +133,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;
}
@ -209,6 +212,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;
}