IB/qib: Fix memory leak of recv context when driver fails to initialize.
authorDennis Dalessandro <dennis.dalessandro@intel.com>
Mon, 17 Mar 2014 18:07:16 +0000 (14:07 -0400)
committerRoland Dreier <roland@purestorage.com>
Mon, 17 Mar 2014 23:16:51 +0000 (16:16 -0700)
In qib_create_ctxts() we allocate an array to hold recv contexts. Then attempt
to create data for those recv contexts. If that call to qib_create_ctxtdata()
fails then an error is returned but the previously allocated memory is not
freed.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/qib/qib_init.c

index 7fbf466..5b7aeb2 100644 (file)
@@ -130,7 +130,6 @@ void qib_set_ctxtcnt(struct qib_devdata *dd)
 int qib_create_ctxts(struct qib_devdata *dd)
 {
        unsigned i;
-       int ret;
        int local_node_id = pcibus_to_node(dd->pcidev->bus);
 
        if (local_node_id < 0)
@@ -145,8 +144,7 @@ int qib_create_ctxts(struct qib_devdata *dd)
        if (!dd->rcd) {
                qib_dev_err(dd,
                        "Unable to allocate ctxtdata array, failing\n");
-               ret = -ENOMEM;
-               goto done;
+               return -ENOMEM;
        }
 
        /* create (one or more) kctxt */
@@ -163,15 +161,14 @@ int qib_create_ctxts(struct qib_devdata *dd)
                if (!rcd) {
                        qib_dev_err(dd,
                                "Unable to allocate ctxtdata for Kernel ctxt, failing\n");
-                       ret = -ENOMEM;
-                       goto done;
+                       kfree(dd->rcd);
+                       dd->rcd = NULL;
+                       return -ENOMEM;
                }
                rcd->pkeys[0] = QIB_DEFAULT_P_KEY;
                rcd->seq_cnt = 1;
        }
-       ret = 0;
-done:
-       return ret;
+       return 0;
 }
 
 /*