[dpdk-dev,1/2] virtio: fixed segmentation fault in queue_release

Message ID 1445355462-16521-1-git-send-email-bernard.iremonger@intel.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Iremonger, Bernard Oct. 20, 2015, 3:37 p.m. UTC
  if input parameter vq is NULL, hw = vq->hw, causes a segmentation fault.

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/virtio/virtio_ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
  

Comments

Stephen Hemminger Oct. 20, 2015, 6:44 p.m. UTC | #1
On Tue, 20 Oct 2015 16:37:41 +0100
Bernard Iremonger <bernard.iremonger@intel.com> wrote:

> if input parameter vq is NULL, hw = vq->hw, causes a segmentation fault.
> 
> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 465d3cd..147aca1 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -239,9 +239,10 @@ virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues)
>  
>  void
>  virtio_dev_queue_release(struct virtqueue *vq) {
> -	struct virtio_hw *hw = vq->hw;
> +	struct virtio_hw *hw;
>  
>  	if (vq) {
> +		hw = vq->hw;
>  		/* Select and deactivate the queue */
>  		VIRTIO_WRITE_REG_2(hw, VIRTIO_PCI_QUEUE_SEL, vq->queue_id);
>  		VIRTIO_WRITE_REG_4(hw, VIRTIO_PCI_QUEUE_PFN, 0);

This could only happen for the case of the control vq.
Others are guaranteed to be non NULL by rte_ethdev.

Acked-by: Stephen Hemminger <stephen@networkplumber.org>
  
Thomas Monjalon Oct. 20, 2015, 9:32 p.m. UTC | #2
2015-10-20 11:44, Stephen Hemminger:
> On Tue, 20 Oct 2015 16:37:41 +0100
> Bernard Iremonger <bernard.iremonger@intel.com> wrote:
> 
> > if input parameter vq is NULL, hw = vq->hw, causes a segmentation fault.
> > 
> > Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> 
> This could only happen for the case of the control vq.
> Others are guaranteed to be non NULL by rte_ethdev.
> 
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>

Applied and merged with doc patch, thanks
  

Patch

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 465d3cd..147aca1 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -239,9 +239,10 @@  virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues)
 
 void
 virtio_dev_queue_release(struct virtqueue *vq) {
-	struct virtio_hw *hw = vq->hw;
+	struct virtio_hw *hw;
 
 	if (vq) {
+		hw = vq->hw;
 		/* Select and deactivate the queue */
 		VIRTIO_WRITE_REG_2(hw, VIRTIO_PCI_QUEUE_SEL, vq->queue_id);
 		VIRTIO_WRITE_REG_4(hw, VIRTIO_PCI_QUEUE_PFN, 0);