diff options
author | Ralph Campbell <ralph.campbell@qlogic.com> | 2007-10-24 18:49:39 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-11-13 18:26:57 -0500 |
commit | a6e7550d8f73d6b75c20afff321f0f06fe144775 (patch) | |
tree | 418033c4e3dd2c35b5d52e8cc7b0de6715f619a4 /drivers/infiniband | |
parent | 3bba11e5c47dfc1d381a1ece26464fb7eea2d79c (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.c | 11 |
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 | ||
462 | bail_unlock: | ||
463 | spin_unlock_irq(&cq->lock); | ||
464 | bail_free: | ||
465 | vfree(wc); | ||
463 | bail: | 466 | bail: |
464 | return ret; | 467 | return ret; |
465 | } | 468 | } |