mirror of
https://github.com/libevent/libevent.git
synced 2025-01-31 09:12:55 +08:00
be: fix with filtered bufferevents and connect() without EAGAIN
With filtered bufferevents (i.e. not real one, that have socket), we can trigger incorrect callback in this case. Let's look at example with http and bufferevent_openssl_filter_new(): - bev = bufferevent_openssl_filter_new() - http layer trying to connect() to localhost with bev # at this time, bev have writecb/readcb NULL but ev_write/ev_read has # timeout with 45 secs, default HTTP connect timeout - and when connect() retruns without EAGAIN (BSD'ism) we called event_active() before (with EV_WRITE), and this will call ev_write timeout only, while it is more correct to act on bufferevent instead of plain event, so let's trigger EV_WRITE for bufferevent which will do the job (and let's do this deferred). Fixes: http/https_simple # under solaris
This commit is contained in:
parent
09b6201304
commit
9a0a3a3e65
@ -438,13 +438,12 @@ bufferevent_socket_connect(struct bufferevent *bev,
|
||||
/* The connect succeeded already. How very BSD of it. */
|
||||
result = 0;
|
||||
bufev_p->connecting = 1;
|
||||
event_active(&bev->ev_write, EV_WRITE, 1);
|
||||
bufferevent_trigger_nolock_(bev, EV_WRITE, BEV_OPT_DEFER_CALLBACKS);
|
||||
} else {
|
||||
/* The connect failed already. How very BSD of it. */
|
||||
bufev_p->connection_refused = 1;
|
||||
bufev_p->connecting = 1;
|
||||
result = 0;
|
||||
event_active(&bev->ev_write, EV_WRITE, 1);
|
||||
bufferevent_run_eventcb_(bev, BEV_EVENT_ERROR, BEV_OPT_DEFER_CALLBACKS);
|
||||
bufferevent_disable(bev, EV_WRITE|EV_READ);
|
||||
}
|
||||
|
||||
goto done;
|
||||
|
Loading…
x
Reference in New Issue
Block a user