diff options
author | Azat Khuzhin <a3at.mail@gmail.com> | 2014-11-21 09:00:12 +0300 |
---|---|---|
committer | Azat Khuzhin <a3at.mail@gmail.com> | 2014-11-21 09:00:12 +0300 |
commit | f133b8693e072b4c05a9773a5f88928c47c04e50 (patch) | |
tree | fd390056aabebca8cedcc11326dc5c45d47cbea8 /bufferevent_async.c | |
parent | 6dba1694c89119c44cef03528945e5a5978ab43a (diff) | |
download | libevent-f133b8693e072b4c05a9773a5f88928c47c04e50.tar.gz |
be async: avoid double close()
In case when between this two close (close(F), close(F)) some open()
will be executed, than we will close newly opened fd.
Reported-by: xujiezhige@163.com
Diffstat (limited to 'bufferevent_async.c')
-rw-r--r-- | bufferevent_async.c | 6 |
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; |