修正当进程句柄限制不足时,存在的随机关闭FD的问题并调整SSL关闭时的fd处理位置。
* 原实现在接收fd时,没有考虑可能只接收1个fd的情况。导致程序在接收1个fd时按2个fd处理,越界访问随机关闭fd。 * 现修正,接收2个一下fd时,关闭接收的fd。 * 同时调整SSL连接的FD关闭位置,改为在conn_private销毁时统一关闭,不在ssl部分关闭。
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user