修正KNI接受模块在KNI重复注册时导致的double-free问题

This commit is contained in:
Lu Qiuwen
2018-11-04 14:03:00 +08:00
parent b3b65369d8
commit 8962026092
2 changed files with 49 additions and 33 deletions

View File

@@ -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;

View File

@@ -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");