| From baa68bfb90d02ecc56e8f9a34442aab892a69b9c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 26 Apr 2020 00:35:45 +0100 |
| Subject: RDMA/rxe: Always return ERR_PTR from rxe_create_mmap_info() |
| |
| From: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| |
| [ Upstream commit bb43c8e382e5da0ee253e3105d4099820ff4d922 ] |
| |
| The commit below modified rxe_create_mmap_info() to return ERR_PTR's but |
| didn't update the callers to handle them. Modify rxe_create_mmap_info() to |
| only return ERR_PTR and fix all error checking after |
| rxe_create_mmap_info() is called. |
| |
| Ensure that all other exit paths properly set the error return. |
| |
| Fixes: ff23dfa13457 ("IB: Pass only ib_udata in function prototypes") |
| Link: https://lore.kernel.org/r/20200425233545.17210-1-sudipm.mukherjee@gmail.com |
| Link: https://lore.kernel.org/r/20200511183742.GB225608@mwanda |
| Cc: stable@vger.kernel.org [5.4+] |
| Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/sw/rxe/rxe_mmap.c | 2 +- |
| drivers/infiniband/sw/rxe/rxe_queue.c | 11 +++++++---- |
| 2 files changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/infiniband/sw/rxe/rxe_mmap.c b/drivers/infiniband/sw/rxe/rxe_mmap.c |
| index 48f48122ddcb8..6a413d73b95dd 100644 |
| --- a/drivers/infiniband/sw/rxe/rxe_mmap.c |
| +++ b/drivers/infiniband/sw/rxe/rxe_mmap.c |
| @@ -151,7 +151,7 @@ struct rxe_mmap_info *rxe_create_mmap_info(struct rxe_dev *rxe, u32 size, |
| |
| ip = kmalloc(sizeof(*ip), GFP_KERNEL); |
| if (!ip) |
| - return NULL; |
| + return ERR_PTR(-ENOMEM); |
| |
| size = PAGE_ALIGN(size); |
| |
| diff --git a/drivers/infiniband/sw/rxe/rxe_queue.c b/drivers/infiniband/sw/rxe/rxe_queue.c |
| index ff92704de32ff..245040c3a35d0 100644 |
| --- a/drivers/infiniband/sw/rxe/rxe_queue.c |
| +++ b/drivers/infiniband/sw/rxe/rxe_queue.c |
| @@ -45,12 +45,15 @@ int do_mmap_info(struct rxe_dev *rxe, struct mminfo __user *outbuf, |
| |
| if (outbuf) { |
| ip = rxe_create_mmap_info(rxe, buf_size, udata, buf); |
| - if (!ip) |
| + if (IS_ERR(ip)) { |
| + err = PTR_ERR(ip); |
| goto err1; |
| + } |
| |
| - err = copy_to_user(outbuf, &ip->info, sizeof(ip->info)); |
| - if (err) |
| + if (copy_to_user(outbuf, &ip->info, sizeof(ip->info))) { |
| + err = -EFAULT; |
| goto err2; |
| + } |
| |
| spin_lock_bh(&rxe->pending_lock); |
| list_add(&ip->pending_mmaps, &rxe->pending_mmaps); |
| @@ -64,7 +67,7 @@ int do_mmap_info(struct rxe_dev *rxe, struct mminfo __user *outbuf, |
| err2: |
| kfree(ip); |
| err1: |
| - return -EINVAL; |
| + return err; |
| } |
| |
| inline void rxe_queue_reset(struct rxe_queue *q) |
| -- |
| 2.20.1 |
| |