IB/hfi1: Restore allocated resources on failed copyout
authorDean Luick <dean.luick@cornelisnetworks.com>
Thu, 12 Jan 2023 18:16:02 +0000 (13:16 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Feb 2023 18:17:58 +0000 (19:17 +0100)
[ Upstream commit 6601fc0d15ffc20654e39486f9bef35567106d68 ]

Fix a resource leak if an error occurs.

Fixes: f404ca4c7ea8 ("IB/hfi1: Refactor hfi_user_exp_rcv_setup() IOCTL")
Signed-off-by: Dean Luick <dean.luick@cornelisnetworks.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Link: https://lore.kernel.org/r/167354736291.2132367.10894218740150168180.stgit@awfm-02.cornelisnetworks.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/hfi1/file_ops.c

index 686d170a5947eec2f1a127f92a96f418dd288ce4..1c1172aeb36e9459a0ee6130db4315789099884e 100644 (file)
@@ -1318,12 +1318,15 @@ static int user_exp_rcv_setup(struct hfi1_filedata *fd, unsigned long arg,
                addr = arg + offsetof(struct hfi1_tid_info, tidcnt);
                if (copy_to_user((void __user *)addr, &tinfo.tidcnt,
                                 sizeof(tinfo.tidcnt)))
-                       return -EFAULT;
+                       ret = -EFAULT;
 
                addr = arg + offsetof(struct hfi1_tid_info, length);
-               if (copy_to_user((void __user *)addr, &tinfo.length,
+               if (!ret && copy_to_user((void __user *)addr, &tinfo.length,
                                 sizeof(tinfo.length)))
                        ret = -EFAULT;
+
+               if (ret)
+                       hfi1_user_exp_rcv_invalid(fd, &tinfo);
        }
 
        return ret;