Fix the crash if a memif client disconnects before a server says hello

Signed-off-by: Dmitriy Matveichev <[email protected]>
---

If a memif client disconnects before a server says hello in 
memif_listener_handler we get errors 
"MEMIF: memif_msg_send_from_queue(): sendmsg fail: Broken pipe.
EAL: PANIC in eal_intr_thread_main():
Error adding fd 59 epoll_ctl, Bad file descriptor".
During the error handling in this func a socket is freed but the 
eal_intr_thread_main knows nothing about it. The descriptor becomes invalid 
after close. 
We should unregister callback from the eal_intr_thread_main loop and only after 
that we can safely free the socket. 

 .mailmap                         |  1 +
 drivers/net/memif/memif_socket.c | 10 ++++++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/.mailmap b/.mailmap
index fcb3d1bb3f..d0148b0d9c 100644
--- a/.mailmap
+++ b/.mailmap
@@ -409,6 +409,7 @@ Ding Zhi <[email protected]>
 Diogo Behrens <[email protected]>
 Dirk-Holger Lenz <[email protected]>
 Dmitri Epshtein <[email protected]>
+Dmitriy Matveichev <[email protected]>
 Dmitriy Yakovlev <[email protected]>
 Dmitry Eremin-Solenikov <[email protected]>
 Dmitry Kozlyuk <[email protected]> <[email protected]>
diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c
index 649f8d0e61..898ad75fa6 100644
--- a/drivers/net/memif/memif_socket.c
+++ b/drivers/net/memif/memif_socket.c
@@ -878,14 +878,16 @@ memif_listener_handler(void *arg)
        return;
 
  error:
-       if (sockfd >= 0) {
-               close(sockfd);
-               sockfd = -1;
-       }
        if (cc != NULL) {
+               rte_intr_callback_unregister(cc->intr_handle, 
memif_intr_handler,
+                                        cc);
                rte_intr_instance_free(cc->intr_handle);
                rte_free(cc);
        }
+       if (sockfd >= 0) {
+               close(sockfd);
+               sockfd = -1;
+       }
 }
 
 static struct memif_socket *
-- 
2.53.0

Reply via email to