vhoat: potential crash in map_guest_mem using debug image 35/17035/4
authorSteven Luong <sluong@cisco.com>
Thu, 24 Jan 2019 06:20:19 +0000 (22:20 -0800)
committerDave Barach <openvpp@barachs.net>
Sat, 23 Feb 2019 12:43:44 +0000 (12:43 +0000)
map_guest_mem may be called from worker-thread/dataplane. It has a call
to vlib_log and may crash inside vlib_log's ASSERT statement

  /* make sure we are running on the main thread to avoid use in dataplane
     code, for dataplane logging consider use of event-logger */
  ASSERT (vlib_get_thread_index () == 0);

The fix is to convert the vlib_log call in map_guest_map to event logger

Change-Id: Iaaf6d86782aa8a18d25e0209f22dc31f04668d56
Signed-off-by: Steven Luong <sluong@cisco.com>
src/vnet/devices/virtio/vhost_user_inline.h

index 02c15ad..544e2d3 100644 (file)
@@ -15,6 +15,7 @@
 #ifndef __VIRTIO_VHOST_USER_INLINE_H__
 #define __VIRTIO_VHOST_USER_INLINE_H__
 /* vhost-user inline functions */
+#include <vppinfra/elog.h>
 
 static_always_inline void *
 map_guest_mem (vhost_user_intf_t * vui, uword addr, u32 * hint)
@@ -134,7 +135,19 @@ vhost_map_guest_mem_done:
        }
     }
 #endif
-  vu_log_err (vui, "failed to map guest mem addr %llx", addr);
+  /* *INDENT-OFF* */
+  ELOG_TYPE_DECLARE (el) =
+  {
+    .format = "failed to map guest mem addr %lx",
+    .format_args = "i8",
+  };
+  /* *INDENT-ON* */
+  struct
+  {
+    uword addr;
+  } *ed;
+  ed = ELOG_DATA (&vlib_global_main.elog_main, el);
+  ed->addr = addr;
   *hint = 0;
   return 0;
 }