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: e6cdc54cc0 ("net/mlx5: add socket server for external tools")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
This commit is contained in:
David Marchand 2021-10-14 13:37:18 +02:00 committed by Raslan Darawsheh
parent 160f0d11bb
commit 7f49dafe05

View File

@ -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 @@ mlx5_pmd_socket_handle(void *cb __rte_unused)
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 @@ mlx5_pmd_socket_init(void)
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));
}