misc: genwqe: should return proper error value.
authorzhong jiang <zhongjiang@huawei.com>
Thu, 20 Sep 2018 02:29:13 +0000 (10:29 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Nov 2019 17:47:31 +0000 (18:47 +0100)
[ Upstream commit 02241995b004faa7d9ff628e97f24056190853f8 ]

The function should return -EFAULT when copy_from_user fails. Even
though the caller does not distinguish them. but we should keep backward
compatibility.

Signed-off-by: zhong jiang <zhongjiang@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/misc/genwqe/card_utils.c

index f68435d..22301bb 100644 (file)
@@ -298,7 +298,7 @@ static int genwqe_sgl_size(int num_pages)
 int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
                          void __user *user_addr, size_t user_size, int write)
 {
-       int rc;
+       int ret = -ENOMEM;
        struct pci_dev *pci_dev = cd->pci_dev;
 
        sgl->fpage_offs = offset_in_page((unsigned long)user_addr);
@@ -318,7 +318,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
        if (get_order(sgl->sgl_size) > MAX_ORDER) {
                dev_err(&pci_dev->dev,
                        "[%s] err: too much memory requested!\n", __func__);
-               return -ENOMEM;
+               return ret;
        }
 
        sgl->sgl = __genwqe_alloc_consistent(cd, sgl->sgl_size,
@@ -326,7 +326,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
        if (sgl->sgl == NULL) {
                dev_err(&pci_dev->dev,
                        "[%s] err: no memory available!\n", __func__);
-               return -ENOMEM;
+               return ret;
        }
 
        /* Only use buffering on incomplete pages */
@@ -339,7 +339,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
                /* Sync with user memory */
                if (copy_from_user(sgl->fpage + sgl->fpage_offs,
                                   user_addr, sgl->fpage_size)) {
-                       rc = -EFAULT;
+                       ret = -EFAULT;
                        goto err_out;
                }
        }
@@ -352,7 +352,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
                /* Sync with user memory */
                if (copy_from_user(sgl->lpage, user_addr + user_size -
                                   sgl->lpage_size, sgl->lpage_size)) {
-                       rc = -EFAULT;
+                       ret = -EFAULT;
                        goto err_out2;
                }
        }
@@ -374,7 +374,8 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
        sgl->sgl = NULL;
        sgl->sgl_dma_addr = 0;
        sgl->sgl_size = 0;
-       return -ENOMEM;
+
+       return ret;
 }
 
 int genwqe_setup_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,