session: fix leak on accept fifo alloc failure 59/26459/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 9 Apr 2020 20:59:20 +0000 (20:59 +0000)
committerDave Barach <openvpp@barachs.net>
Thu, 9 Apr 2020 22:47:02 +0000 (22:47 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ia928d6ea05ff7cb9a15e1ddc58234d000ebfd7fb

src/vnet/session/application_local.c
src/vnet/session/session.c

index 0e1f6db..927bf91 100644 (file)
@@ -294,7 +294,6 @@ ct_connect (app_worker_t * client_wrk, session_t * ll,
 
   if (ct_init_local_session (client_wrk, server_wrk, sct, ss, ll))
     {
-      clib_warning ("failed");
       ct_connection_free (sct);
       session_free (ss);
       return -1;
@@ -303,9 +302,9 @@ ct_connect (app_worker_t * client_wrk, session_t * ll,
   ss->session_state = SESSION_STATE_ACCEPTING;
   if (app_worker_accept_notify (server_wrk, ss))
     {
-      clib_warning ("failed");
       ct_connection_free (sct);
-      session_free_w_fifos (ss);
+      segment_manager_dealloc_fifos (ss->rx_fifo, ss->tx_fifo);
+      session_free (ss);
       return -1;
     }
 
index 1fa7872..d2dc85e 100644 (file)
@@ -1104,7 +1104,10 @@ session_stream_accept (transport_connection_t * tc, u32 listener_index,
   s->session_state = SESSION_STATE_CREATED;
 
   if ((rv = app_worker_init_accepted (s)))
-    return rv;
+    {
+      session_free (s);
+      return rv;
+    }
 
   session_lookup_add_connection (tc, session_handle (s));
 
@@ -1112,7 +1115,13 @@ session_stream_accept (transport_connection_t * tc, u32 listener_index,
   if (notify)
     {
       app_worker_t *app_wrk = app_worker_get (s->app_wrk_index);
-      return app_worker_accept_notify (app_wrk, s);
+      if ((rv = app_worker_accept_notify (app_wrk, s)))
+       {
+         session_lookup_del_session (s);
+         segment_manager_dealloc_fifos (s->rx_fifo, s->tx_fifo);
+         session_free (s);
+         return rv;
+       }
     }
 
   return 0;
@@ -1138,7 +1147,8 @@ session_dgram_accept (transport_connection_t * tc, u32 listener_index,
   app_wrk = app_worker_get (s->app_wrk_index);
   if ((rv = app_worker_accept_notify (app_wrk, s)))
     {
-      session_free_w_fifos (s);
+      segment_manager_dealloc_fifos (s->rx_fifo, s->tx_fifo);
+      session_free (s);
       return rv;
     }