vhost: fix crash on port deletion
authorZhike Wang <wangzhike@jd.com>
Thu, 16 Jan 2020 02:07:37 +0000 (10:07 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 5 Feb 2020 10:47:18 +0000 (11:47 +0100)
commit499fd8e5b89c2ce65d57875d0a7d67f3a7f2fb6b
tree0c1995fd5cebabd78aedb4fe25db689adf7870ac
parent92771257316f04157a863885979397731e755096
vhost: fix crash on port deletion

The vhost_user_read_cb() and rte_vhost_driver_unregister()
can be called at the same time by 2 threads. Eg thread1
calls vhost_user_read_cb() and removes the vsocket from
conn_list, then thread2 calls rte_vhost_driver_unregister()
and frees the vsocket since it is NOT in the conn_list.
So thread1 will access invalid memory when trying to
reconnect.

The fix is to move the "removing of vsocket from conn_list"
to end of the vhost_user_read_cb(), then avoid the race
condition.

The core trace is:
Program terminated with signal 11, Segmentation fault.

Fixes: af1475918124 ("vhost: introduce API to start a specific driver")
Cc: stable@dpdk.org
Signed-off-by: Zhike Wang <wangzhike@jd.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_vhost/socket.c