aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorRalph Campbell <ralph.campbell@qlogic.com>2007-10-24 18:49:39 -0400
committerRoland Dreier <rolandd@cisco.com>2007-11-13 18:26:57 -0500
commita6e7550d8f73d6b75c20afff321f0f06fe144775 (patch)
tree418033c4e3dd2c35b5d52e8cc7b0de6715f619a4 /drivers/infiniband
parent3bba11e5c47dfc1d381a1ece26464fb7eea2d79c (diff)
IB/ipath: Fix memory leak in ipath_resize_cq() if copy_to_user() fails
Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com> Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_cq.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_cq.c b/drivers/infiniband/hw/ipath/ipath_cq.c
index 645ed71fd797..08d8ae148cd0 100644
--- a/drivers/infiniband/hw/ipath/ipath_cq.c
+++ b/drivers/infiniband/hw/ipath/ipath_cq.c
@@ -404,7 +404,7 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
404 404
405 ret = ib_copy_to_udata(udata, &offset, sizeof(offset)); 405 ret = ib_copy_to_udata(udata, &offset, sizeof(offset));
406 if (ret) 406 if (ret)
407 goto bail; 407 goto bail_free;
408 } 408 }
409 409
410 spin_lock_irq(&cq->lock); 410 spin_lock_irq(&cq->lock);
@@ -424,10 +424,8 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
424 else 424 else
425 n = head - tail; 425 n = head - tail;
426 if (unlikely((u32)cqe < n)) { 426 if (unlikely((u32)cqe < n)) {
427 spin_unlock_irq(&cq->lock);
428 vfree(wc);
429 ret = -EOVERFLOW; 427 ret = -EOVERFLOW;
430 goto bail; 428 goto bail_unlock;
431 } 429 }
432 for (n = 0; tail != head; n++) { 430 for (n = 0; tail != head; n++) {
433 if (cq->ip) 431 if (cq->ip)
@@ -459,7 +457,12 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
459 } 457 }
460 458
461 ret = 0; 459 ret = 0;
460 goto bail;
462 461
462bail_unlock:
463 spin_unlock_irq(&cq->lock);
464bail_free:
465 vfree(wc);
463bail: 466bail:
464 return ret; 467 return ret;
465} 468}