session: fix connect corner case crash. 64/8864/2
authorDave Wallace <dwallacelf@gmail.com>
Tue, 17 Oct 2017 20:19:41 +0000 (16:19 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 17 Oct 2017 21:49:17 +0000 (21:49 +0000)
Change-Id: I54ced42749432335183ee3085a9ccc5f95a87ae9
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
src/vnet/session/session_api.c

index e9ddbce..812d727 100755 (executable)
@@ -168,29 +168,32 @@ send_session_connected_callback (u32 app_index, u32 api_context,
   if (!q)
     return -1;
 
-  tc = session_get_transport (s);
-  if (!tc)
-    is_fail = 1;
   mp = vl_msg_api_alloc (sizeof (*mp));
   mp->_vl_msg_id = clib_host_to_net_u16 (VL_API_CONNECT_SESSION_REPLY);
   mp->context = api_context;
-  if (!is_fail)
-    {
-      vpp_queue = session_manager_get_vpp_event_queue (s->thread_index);
-      mp->server_rx_fifo = pointer_to_uword (s->server_rx_fifo);
-      mp->server_tx_fifo = pointer_to_uword (s->server_tx_fifo);
-      mp->handle = session_handle (s);
-      mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
-      clib_memcpy (mp->lcl_ip, &tc->lcl_ip, sizeof (tc->lcl_ip));
-      mp->is_ip4 = tc->is_ip4;
-      mp->lcl_port = tc->lcl_port;
-      mp->retval = 0;
-    }
-  else
+
+  if (is_fail)
+    goto done;
+
+  tc = session_get_transport (s);
+  if (!tc)
     {
-      mp->retval = clib_host_to_net_u32 (VNET_API_ERROR_SESSION_CONNECT);
+      is_fail = 1;
+      goto done;
     }
 
+  vpp_queue = session_manager_get_vpp_event_queue (s->thread_index);
+  mp->server_rx_fifo = pointer_to_uword (s->server_rx_fifo);
+  mp->server_tx_fifo = pointer_to_uword (s->server_tx_fifo);
+  mp->handle = session_handle (s);
+  mp->vpp_event_queue_address = pointer_to_uword (vpp_queue);
+  clib_memcpy (mp->lcl_ip, &tc->lcl_ip, sizeof (tc->lcl_ip));
+  mp->is_ip4 = tc->is_ip4;
+  mp->lcl_port = tc->lcl_port;
+
+done:
+  mp->retval = is_fail ?
+    clib_host_to_net_u32 (VNET_API_ERROR_SESSION_CONNECT) : 0;
   vl_msg_api_send_shmem (q, (u8 *) & mp);
   return 0;
 }