summaryrefslogtreecommitdiff
path: root/bufferevent_async.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-08-24 21:39:28 -0400
committerNick Mathewson <nickm@torproject.org>2011-08-28 14:39:12 -0400
commite6af35d762822e56e97cca3708ffee291c867d20 (patch)
treeff4499e205590b1ca543e9a2c6d86e8dbe75efbc /bufferevent_async.c
parent0ff2c5a92246083495ff4d672372b8afe510105b (diff)
downloadlibevent-e6af35d762822e56e97cca3708ffee291c867d20.tar.gz
Correctly terminate IO on an async bufferevent on bufferevent_free
Diffstat (limited to 'bufferevent_async.c')
-rw-r--r--bufferevent_async.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/bufferevent_async.c b/bufferevent_async.c
index 9416e31f..a3b3ab1e 100644
--- a/bufferevent_async.c
+++ b/bufferevent_async.c
@@ -268,8 +268,8 @@ bev_async_consider_reading(struct bufferevent_async *beva)
bufferevent_incref(bev);
if (evbuffer_launch_read(bev->input, at_most, &beva->read_overlapped)) {
beva->ok = 0;
- bufferevent_decref(bev);
_bufferevent_run_eventcb(bev, BEV_EVENT_ERROR);
+ bufferevent_decref(bev);
} else {
beva->read_in_progress = at_most;
_bufferevent_decrement_read_buckets(&beva->bev, at_most);
@@ -379,8 +379,10 @@ be_async_destruct(struct bufferevent *bev)
bev_async_del_write(bev_async);
fd = _evbuffer_overlapped_get_fd(bev->input);
- if (bev_p->options & BEV_OPT_CLOSE_ON_FREE)
+ if (bev_p->options & BEV_OPT_CLOSE_ON_FREE) {
+ /* XXXX possible double-close */
evutil_closesocket(fd);
+ }
/* delete this in case non-blocking connect was used */
if (event_initialized(&bev->ev_write)) {
event_del(&bev->ev_write);
@@ -669,8 +671,20 @@ be_async_ctrl(struct bufferevent *bev, enum bufferevent_ctrl_op op,
_evbuffer_overlapped_set_fd(bev->output, data->fd);
return 0;
}
+ case BEV_CTRL_CANCEL_ALL: {
+ struct bufferevent_async *bev_a = upcast(bev);
+ evutil_socket_t fd = _evbuffer_overlapped_get_fd(bev->input);
+ if (fd != (evutil_socket_t)INVALID_SOCKET &&
+ (bev_a->bev.options & BEV_OPT_CLOSE_ON_FREE)) {
+ closesocket(fd);
+ }
+ bev_a->ok = 0;
+ return 0;
+ }
case BEV_CTRL_GET_UNDERLYING:
default:
return -1;
}
}
+
+