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:
parent
160f0d11bb
commit
7f49dafe05
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user