Fix several resource leaks in error handling and cleanup paths:
In memif_socket_create(), when rte_intr_callback_register() fails,
return via error path instead of returning directly, ensuring sockfd,
sock and intr_handle are properly cleaned up.
In memif_socket_init(), when rte_hash_add_key_data() fails, clean up
the newly created socket including unregistering callback, closing fd
and freeing intr_handle for listener sockets.
In memif_socket_remove_device(), unregister the listener callback and
close the socket fd before freeing the interrupt handle.
Fixes: 09c7e63a71f9 ("net/memif: introduce memory interface PMD")
Cc: [email protected]
Signed-off-by: David Marchand <[email protected]>
---
drivers/net/memif/memif_socket.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c
index 2d16decbef..bd52a95473 100644
--- a/drivers/net/memif/memif_socket.c
+++ b/drivers/net/memif/memif_socket.c
@@ -1051,7 +1051,7 @@ memif_socket_create(char *key, uint8_t listener, bool
is_abstract, uid_t owner_u
if (ret < 0) {
MIF_LOG(ERR, "Failed to register interrupt "
"callback for listener socket");
- return NULL;
+ goto error;
}
}
@@ -1115,6 +1115,14 @@ memif_socket_init(struct rte_eth_dev *dev, const char
*socket_filename)
ret = rte_hash_add_key_data(hash, key, socket);
if (ret < 0) {
MIF_LOG(ERR, "Failed to add socket to socket hash.");
+ if (socket->listener) {
+
rte_intr_callback_unregister(socket->intr_handle,
+ memif_listener_handler, socket);
+ close(rte_intr_fd_get(socket->intr_handle));
+ rte_intr_fd_set(socket->intr_handle, -1);
+ rte_intr_instance_free(socket->intr_handle);
+ }
+ rte_free(socket);
return ret;
}
}
@@ -1180,8 +1188,13 @@ memif_socket_remove_device(struct rte_eth_dev *dev)
MIF_LOG(ERR, "Failed to remove socket file: %s",
socket->filename);
}
- if (pmd->role != MEMIF_ROLE_CLIENT)
+ if (pmd->role != MEMIF_ROLE_CLIENT) {
+ rte_intr_callback_unregister(socket->intr_handle,
memif_listener_handler,
+ socket);
+ close(rte_intr_fd_get(socket->intr_handle));
+ rte_intr_fd_set(socket->intr_handle, -1);
rte_intr_instance_free(socket->intr_handle);
+ }
rte_free(socket);
}
}
--
2.54.0