修正KNI接受模块在KNI重复注册时导致的double-free问题
This commit is contained in:
@@ -104,9 +104,17 @@ struct kni_acceptor
|
|||||||
|
|
||||||
void __kni_conn_close(struct kni_acceptor * ctx)
|
void __kni_conn_close(struct kni_acceptor * ctx)
|
||||||
{
|
{
|
||||||
if (ctx->fd_kni_conn != 0) close(ctx->fd_kni_conn);
|
if (ctx->fd_kni_conn != 0)
|
||||||
if (ctx->ev_kni_conn != NULL) event_free(ctx->ev_kni_conn);
|
{
|
||||||
if (ctx->pid_kni_conn != 0) ctx->pid_kni_conn = 0;
|
close(ctx->fd_kni_conn);
|
||||||
|
ctx->fd_kni_conn = 0;
|
||||||
|
}
|
||||||
|
if (ctx->ev_kni_conn != NULL)
|
||||||
|
{
|
||||||
|
event_free(ctx->ev_kni_conn);
|
||||||
|
ctx->ev_kni_conn = NULL;
|
||||||
|
}
|
||||||
|
if (ctx->pid_kni_conn != 0) { ctx->pid_kni_conn = 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __kni_parse_tlv_data(struct kni_acceptor * ctx,
|
static int __kni_parse_tlv_data(struct kni_acceptor * ctx,
|
||||||
@@ -229,7 +237,7 @@ void __kni_event_cb(evutil_socket_t fd, short what, void * user)
|
|||||||
}
|
}
|
||||||
else if (rd == 0)
|
else if (rd == 0)
|
||||||
{
|
{
|
||||||
TFE_LOG_INFO(__ctx->logger, "KNI connected from process %u. ", __ctx->pid_kni_conn);
|
TFE_LOG_INFO(__ctx->logger, "KNI disconnect (PID = %u). ", __ctx->pid_kni_conn);
|
||||||
goto __close_kni_connection;
|
goto __close_kni_connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,8 +272,8 @@ __close_kni_connection:
|
|||||||
|
|
||||||
__drop_recieved_fds:
|
__drop_recieved_fds:
|
||||||
TFE_PROXY_STAT_INCREASE(STAT_FD_CLOSE_BY_KNI_ACCEPT_FAIL, 2);
|
TFE_PROXY_STAT_INCREASE(STAT_FD_CLOSE_BY_KNI_ACCEPT_FAIL, 2);
|
||||||
evutil_closesocket(__fds[0]);
|
if (__fds != NULL) evutil_closesocket(__fds[0]);
|
||||||
evutil_closesocket(__fds[1]);
|
if (__fds != NULL) evutil_closesocket(__fds[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kni_listener_accept_cb(struct evconnlistener * listener, evutil_socket_t fd,
|
void __kni_listener_accept_cb(struct evconnlistener * listener, evutil_socket_t fd,
|
||||||
@@ -288,20 +296,21 @@ void __kni_listener_accept_cb(struct evconnlistener * listener, evutil_socket_t
|
|||||||
{
|
{
|
||||||
TFE_LOG_ERROR(__ctx->logger, "One KNI(PID = %d) has been connected to our program, "
|
TFE_LOG_ERROR(__ctx->logger, "One KNI(PID = %d) has been connected to our program, "
|
||||||
"close this connection", __ctx->pid_kni_conn);
|
"close this connection", __ctx->pid_kni_conn);
|
||||||
goto __close_this_connection;
|
evutil_closesocket(fd);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get Peer's PID */
|
/* Get Peer's PID */
|
||||||
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void *) &__cr, &__cr_len) < 0)
|
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void *) &__cr, &__cr_len) < 0)
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(__ctx->logger, "Failed at getsockopt(SO_PEERCRED) for fd %d, close this connection");
|
TFE_LOG_ERROR(__ctx->logger, "Failed at getsockopt(SO_PEERCRED) for fd %d, close this connection", fd);
|
||||||
goto __close_this_connection;
|
goto __close_this_connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
__event = event_new(__ctx->ev_base, fd, EV_READ | EV_PERSIST, __kni_event_cb, __ctx);
|
__event = event_new(__ctx->ev_base, fd, EV_READ | EV_PERSIST, __kni_event_cb, __ctx);
|
||||||
if (unlikely(__event == NULL))
|
if (unlikely(__event == NULL))
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(__ctx->logger, "Failed at creating event, close this connection.");
|
TFE_LOG_ERROR(__ctx->logger, "Failed at creating event for fd %d, close this connection.", fd);
|
||||||
goto __close_this_connection;
|
goto __close_this_connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,7 +325,7 @@ void __kni_listener_accept_cb(struct evconnlistener * listener, evutil_socket_t
|
|||||||
__ctx->ev_kni_conn = __event;
|
__ctx->ev_kni_conn = __event;
|
||||||
__ctx->pid_kni_conn = __cr.pid;
|
__ctx->pid_kni_conn = __cr.pid;
|
||||||
|
|
||||||
TFE_LOG_INFO(__ctx->logger, "KNI connected from process %u", __ctx->pid_kni_conn);
|
TFE_LOG_INFO(__ctx->logger, "KNI connected (PID = %u, fd = %d). ", __ctx->pid_kni_conn, __ctx->fd_kni_conn);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
__close_this_connection:
|
__close_this_connection:
|
||||||
@@ -376,7 +385,8 @@ struct kni_acceptor * kni_acceptor_init(struct tfe_proxy *proxy, const char *pro
|
|||||||
if (unlikely(unlink(__ctx->str_unixdomain_file) < 0))
|
if (unlikely(unlink(__ctx->str_unixdomain_file) < 0))
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(__ctx->logger, "Failed at unlink undomain file %s: %s",
|
TFE_LOG_ERROR(__ctx->logger, "Failed at unlink undomain file %s: %s",
|
||||||
__ctx->str_unixdomain_file, strerror(errno)); goto __errout;
|
__ctx->str_unixdomain_file, strerror(errno));
|
||||||
|
goto __errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
__sockaddr_un.sun_family = AF_UNIX;
|
__sockaddr_un.sun_family = AF_UNIX;
|
||||||
|
|||||||
@@ -300,7 +300,13 @@ int main(int argc, char * argv[])
|
|||||||
{
|
{
|
||||||
const char * main_profile = "./conf/tfe.conf";
|
const char * main_profile = "./conf/tfe.conf";
|
||||||
|
|
||||||
g_default_logger = MESA_create_runtime_log_handle("log/tfe.log", RLOG_LV_DEBUG);
|
unsigned int __log_level = RLOG_LV_INFO;
|
||||||
|
MESA_load_profile_uint_def(main_profile, "log", "level", &__log_level, RLOG_LV_INFO);
|
||||||
|
|
||||||
|
char __log_path[TFE_STRING_MAX]= {};
|
||||||
|
MESA_load_profile_string_def(main_profile, "log", "location", __log_path, sizeof(__log_path), "log/tfe.log");
|
||||||
|
|
||||||
|
g_default_logger = MESA_create_runtime_log_handle(__log_path, __log_level);
|
||||||
if (unlikely(g_default_logger == NULL))
|
if (unlikely(g_default_logger == NULL))
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(g_default_logger, "Failed at creating default logger: %s", "log/tfe.log");
|
TFE_LOG_ERROR(g_default_logger, "Failed at creating default logger: %s", "log/tfe.log");
|
||||||
|
|||||||
Reference in New Issue
Block a user