From: Azat Khuzhin Date: Wed, 10 Aug 2016 13:04:33 +0000 (+0300) Subject: be_sock: handle readv() returns ECONNREFUSED (freebsd 9.2) X-Git-Tag: release-2.1.6-beta~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3189eb000b6d8751223061930a019f85c284f985;p=libevent be_sock: handle readv() returns ECONNREFUSED (freebsd 9.2) During testing sometimes bufferevent/bufferevent_connect_fail_eventcb fails, and after some digging I found that this was the case when connect() doesn't return ECONNREFUSED immediately, and instead next operation will return it (in our case evbuffer_read()->readv(), needless to say that after this bufferevent_writecb() called and it checks error with getsockopt() but of course it doesn't return any error), so this patch checks "errno" after "readv()" and installs "bufev::connection_refused" flag, to handle this from writecb and only once. Fixes: bufferevent/bufferevent_connect_fail_eventcb Fixes: bufferevent/bufferevent_connect_fail_eventcb_defer Refs: #388 --- diff --git a/bufferevent_sock.c b/bufferevent_sock.c index ab35f879..58095f37 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -192,6 +192,10 @@ bufferevent_readcb(evutil_socket_t fd, short event, void *arg) int err = evutil_socket_geterror(fd); if (EVUTIL_ERR_RW_RETRIABLE(err)) goto reschedule; + if (EVUTIL_ERR_CONNECT_REFUSED(err)) { + bufev_p->connection_refused = 1; + goto done; + } /* error case */ what |= BEV_EVENT_ERROR; } else if (res == 0) {