]> git.droids-corp.org - dpdk.git/commitdiff
net/enic: fix crash when releasing queues
authorJohn Daley <johndale@cisco.com>
Sat, 11 Jun 2016 17:27:04 +0000 (10:27 -0700)
committerBruce Richardson <bruce.richardson@intel.com>
Mon, 20 Jun 2016 15:21:49 +0000 (17:21 +0200)
If device configuration failed due to a lack of resources, such as
if more queues are requested than are available, the queue release
functions are called with NULL pointers which were being dereferenced.

Skip releasing queues if they are NULL pointers.

Fixes: fefed3d1e62c ("enic: new driver")
Signed-off-by: John Daley <johndale@cisco.com>
drivers/net/enic/enic_main.c

index 996f9992460557fb8f13a9aeec9fa12e0db286e6..738792e8b80dc49f908544306eb73c4694f5444f 100644 (file)
@@ -426,9 +426,14 @@ int enic_alloc_intr_resources(struct enic *enic)
 
 void enic_free_rq(void *rxq)
 {
-       struct vnic_rq *rq = (struct vnic_rq *)rxq;
-       struct enic *enic = vnic_dev_priv(rq->vdev);
+       struct vnic_rq *rq;
+       struct enic *enic;
 
+       if (rxq == NULL)
+               return;
+
+       rq = (struct vnic_rq *)rxq;
+       enic = vnic_dev_priv(rq->vdev);
        enic_rxmbuf_queue_release(enic, rq);
        rte_free(rq->mbuf_ring);
        rq->mbuf_ring = NULL;
@@ -514,9 +519,14 @@ err_exit:
 
 void enic_free_wq(void *txq)
 {
-       struct vnic_wq *wq = (struct vnic_wq *)txq;
-       struct enic *enic = vnic_dev_priv(wq->vdev);
+       struct vnic_wq *wq;
+       struct enic *enic;
+
+       if (txq == NULL)
+               return;
 
+       wq = (struct vnic_wq *)txq;
+       enic = vnic_dev_priv(wq->vdev);
        rte_memzone_free(wq->cqmsg_rz);
        vnic_wq_free(wq);
        vnic_cq_free(&enic->cq[enic->rq_count + wq->index]);