From 7f49dafe0534b8a8614492c052d7fbe2e87dc6ae Mon Sep 17 00:00:00 2001 From: David Marchand Date: Thu, 14 Oct 2021 13:37:18 +0200 Subject: [PATCH] net/mlx5: do not close stdin on error If for any reason, a socket could not be opened, mlx5_pmd_socket_init() could close the 0 fd (which is valid, and has a fair chance to be stdin), since server_socket == 0 from the variable being in .bss. Fixes: e6cdc54cc0ef ("net/mlx5: add socket server for external tools") Cc: stable@dpdk.org Signed-off-by: David Marchand Reviewed-by: Dmitry Kozlyuk --- drivers/net/mlx5/linux/mlx5_socket.c | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_socket.c b/drivers/net/mlx5/linux/mlx5_socket.c index db474f030a..4882e5fa2f 100644 --- a/drivers/net/mlx5/linux/mlx5_socket.c +++ b/drivers/net/mlx5/linux/mlx5_socket.c @@ -22,7 +22,7 @@ #define MLX5_SOCKET_PATH "/var/tmp/dpdk_net_mlx5_%d" -int server_socket; /* Unix socket for primary process. */ +int server_socket = -1; /* Unix socket for primary process. */ struct rte_intr_handle *server_intr_handle; /* Interrupt handler. */ /** @@ -144,7 +144,8 @@ error: static int mlx5_pmd_interrupt_handler_install(void) { - MLX5_ASSERT(server_socket); + MLX5_ASSERT(server_socket != -1); + server_intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); if (server_intr_handle == NULL) { @@ -167,7 +168,7 @@ mlx5_pmd_interrupt_handler_install(void) static void mlx5_pmd_interrupt_handler_uninstall(void) { - if (server_socket) { + if (server_socket != -1) { mlx5_intr_callback_unregister(server_intr_handle, mlx5_pmd_socket_handle, NULL); @@ -193,7 +194,7 @@ mlx5_pmd_socket_init(void) int flags; MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY); - if (server_socket) + if (server_socket != -1) return 0; ret = socket(AF_UNIX, SOCK_STREAM, 0); if (ret < 0) { @@ -204,10 +205,10 @@ mlx5_pmd_socket_init(void) server_socket = ret; flags = fcntl(server_socket, F_GETFL, 0); if (flags == -1) - goto error; + goto close; ret = fcntl(server_socket, F_SETFL, flags | O_NONBLOCK); if (ret < 0) - goto error; + goto close; snprintf(sun.sun_path, sizeof(sun.sun_path), MLX5_SOCKET_PATH, getpid()); remove(sun.sun_path); @@ -215,25 +216,26 @@ mlx5_pmd_socket_init(void) if (ret < 0) { DRV_LOG(WARNING, "cannot bind mlx5 socket: %s", strerror(errno)); - goto close; + goto remove; } ret = listen(server_socket, 0); if (ret < 0) { DRV_LOG(WARNING, "cannot listen on mlx5 socket: %s", strerror(errno)); - goto close; + goto remove; } if (mlx5_pmd_interrupt_handler_install()) { DRV_LOG(WARNING, "cannot register interrupt handler for mlx5 socket: %s", strerror(errno)); - goto close; + goto remove; } return 0; -close: +remove: remove(sun.sun_path); -error: +close: claim_zero(close(server_socket)); - server_socket = 0; + server_socket = -1; +error: DRV_LOG(ERR, "Cannot initialize socket: %s", strerror(errno)); return -errno; } @@ -244,11 +246,11 @@ error: void mlx5_pmd_socket_uninit(void) { - if (!server_socket) + if (server_socket == -1) return; mlx5_pmd_interrupt_handler_uninstall(); claim_zero(close(server_socket)); - server_socket = 0; + server_socket = -1; MKSTR(path, MLX5_SOCKET_PATH, getpid()); claim_zero(remove(path)); } -- 2.20.1