summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@freehaven.net>2014-11-24 01:09:13 -0500
committerNick Mathewson <nickm@freehaven.net>2014-11-24 01:09:13 -0500
commit5ebad45e2d60e48ba9c2b1127bd0dd06031f955a (patch)
treefd390056aabebca8cedcc11326dc5c45d47cbea8
parent6dba1694c89119c44cef03528945e5a5978ab43a (diff)
parentf133b8693e072b4c05a9773a5f88928c47c04e50 (diff)
downloadlibevent-5ebad45e2d60e48ba9c2b1127bd0dd06031f955a.tar.gz
Merge pull request #189 from azat/be_async-avoid-doule-close
be async: avoid double close()
-rw-r--r--bufferevent_async.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/bufferevent_async.c b/bufferevent_async.c
index f32573e4..6395e57a 100644
--- a/bufferevent_async.c
+++ b/bufferevent_async.c
@@ -381,9 +381,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) {
- /* XXXX possible double-close */
+ if (fd != (evutil_socket_t)INVALID_SOCKET &&
+ (bev_p->options & BEV_OPT_CLOSE_ON_FREE)) {
evutil_closesocket(fd);
+ evbuffer_overlapped_set_fd_(bev->input, INVALID_SOCKET);
}
}
@@ -671,6 +672,7 @@ be_async_ctrl(struct bufferevent *bev, enum bufferevent_ctrl_op op,
if (fd != (evutil_socket_t)INVALID_SOCKET &&
(bev_a->bev.options & BEV_OPT_CLOSE_ON_FREE)) {
closesocket(fd);
+ evbuffer_overlapped_set_fd_(bev->input, INVALID_SOCKET);
}
bev_a->ok = 0;
return 0;