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 | |
| 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>
| -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 | } |
