[dpdk-dev] net/virtio-user: fix crash when detaching device

Message ID 20170623124137.61091-1-allain.legacy@windriver.com (mailing list archive)
State Accepted, archived
Delegated to: Yuanhan Liu
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Allain Legacy June 23, 2017, 12:41 p.m. UTC
  The rte_eth_dev.data pointer is set to a reference to a static table.
Attempting to rte_free() it leads to a panic.  For example, the
following commands result in a panic if run in testpmd

  testpmd> port attach virtio_user0,path=/dev/vhost-net,iface=test0
  testpmd> port stop 2
  testpmd> port close 2
  testpmd> port detach 2

Fixes: ce2eabdd43ec ("net/virtio-user: add virtual device")

Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
---
 drivers/net/virtio/virtio_user_ethdev.c | 1 -
 1 file changed, 1 deletion(-)
  

Comments

Yuanhan Liu July 4, 2017, 9:25 a.m. UTC | #1
On Fri, Jun 23, 2017 at 08:41:37AM -0400, Allain Legacy wrote:
> The rte_eth_dev.data pointer is set to a reference to a static table.
> Attempting to rte_free() it leads to a panic.  For example, the
> following commands result in a panic if run in testpmd
> 
>   testpmd> port attach virtio_user0,path=/dev/vhost-net,iface=test0
>   testpmd> port stop 2
>   testpmd> port close 2
>   testpmd> port detach 2
> 
> Fixes: ce2eabdd43ec ("net/virtio-user: add virtual device")

Note that it's prefered (and asked) to add stable tag inside the commit log.

    Cc: stable@dpdk.org

Applied to dpdk-next-virtio, with above tag added.

Thanks.

	--yliu
  

Patch

diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 280406c02..e9af946e8 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -556,7 +556,6 @@  virtio_user_pmd_remove(struct rte_vdev_device *vdev)
 	virtio_user_dev_uninit(dev);
 
 	rte_free(eth_dev->data->dev_private);
-	rte_free(eth_dev->data);
 	rte_eth_dev_release_port(eth_dev);
 
 	return 0;