修正当进程句柄限制不足时,存在的随机关闭FD的问题并调整SSL关闭时的fd处理位置。

* 原实现在接收fd时,没有考虑可能只接收1个fd的情况。导致程序在接收1个fd时按2个fd处理,越界访问随机关闭fd。
* 现修正,接收2个一下fd时,关闭接收的fd。
* 同时调整SSL连接的FD关闭位置,改为在conn_private销毁时统一关闭,不在ssl部分关闭。
This commit is contained in:
luqiuwen
2019-09-05 16:16:51 +08:00
parent c9d814e17b
commit 611d978b91
4 changed files with 35 additions and 17 deletions

View File

@@ -401,7 +401,11 @@ evutil_socket_t __conn_private_release_fd(struct tfe_conn_private * conn)
static void __conn_private_destory(struct tfe_conn_private * conn)
{
bufferevent_disable(conn->bev, EV_READ | EV_WRITE);
if (conn->bev)
{
bufferevent_disable(conn->bev, EV_READ | EV_WRITE);
bufferevent_free(conn->bev);
}
if(conn->ratelimit_bucket)
{
@@ -409,10 +413,9 @@ static void __conn_private_destory(struct tfe_conn_private * conn)
conn->ratelimit_bucket = NULL;
}
bufferevent_free(conn->bev);
if (conn->fd > 0)
{
evutil_closesocket(conn->fd);
assert(evutil_closesocket(conn->fd) >= 0);
}
free(conn);
@@ -423,8 +426,7 @@ static void __conn_private_destory_with_ssl(struct event_base * ev_base,
struct tfe_conn_private * conn, struct ssl_stream * ssl_stream)
{
if (ssl_stream == NULL) return __conn_private_destory(conn);
ssl_stream_free_and_close_fd(ssl_stream, ev_base, conn->bev);
conn->fd = -1;
ssl_stream_free(ssl_stream, ev_base, conn->bev);
return __conn_private_destory(conn);
}
@@ -1125,21 +1127,23 @@ void tfe_stream_destory(struct tfe_stream_private * stream)
if (__is_ssl(stream) && stream->ssl_upstream)
{
ssl_stream_free_and_close_fd(stream->ssl_upstream, ev_base, stream->conn_upstream->bev);
ssl_stream_free(stream->ssl_upstream, ev_base, stream->conn_upstream->bev);
}
if (__is_ssl(stream) && stream->ssl_downstream)
{
ssl_stream_free_and_close_fd(stream->ssl_downstream, ev_base, stream->conn_downstream->bev);
ssl_stream_free(stream->ssl_downstream, ev_base, stream->conn_downstream->bev);
}
if (stream->conn_upstream)
{
assert(stream->defer_fd_upstream <= 0);
__conn_private_destory(stream->conn_upstream);
}
if (stream->conn_downstream)
{
assert(stream->defer_fd_downstream <= 0);
__conn_private_destory(stream->conn_downstream);
}