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

Reply via email to