]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
VMCI: check return value of get_user_pages_fast() for errors
authorAlex Dewar <alex.dewar90@gmail.com>
Tue, 25 Aug 2020 16:45:18 +0000 (17:45 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 08:55:08 +0000 (09:55 +0100)
[ Upstream commit 90ca6333fd65f318c47bff425e1ea36c0a5539f6 ]

In a couple of places in qp_host_get_user_memory(),
get_user_pages_fast() is called without properly checking for errors. If
e.g. -EFAULT is returned, this negative value will then be passed on to
qp_release_pages(), which expects a u64 as input.

Fix this by only calling qp_release_pages() when we have a positive
number returned.

Fixes: 06164d2b72aa ("VMCI: queue pairs implementation.")
Signed-off-by: Alex Dewar <alex.dewar90@gmail.com>
Link: https://lore.kernel.org/r/20200825164522.412392-1-alex.dewar90@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/misc/vmw_vmci/vmci_queue_pair.c

index bd52f29b4a4e273eb6f69a56c34a0789279d2226..5e0d1ac67f73febde1d5696463551acd1f2670c3 100644 (file)
@@ -671,8 +671,9 @@ static int qp_host_get_user_memory(u64 produce_uva,
        if (retval < (int)produce_q->kernel_if->num_pages) {
                pr_debug("get_user_pages_fast(produce) failed (retval=%d)",
                        retval);
-               qp_release_pages(produce_q->kernel_if->u.h.header_page,
-                                retval, false);
+               if (retval > 0)
+                       qp_release_pages(produce_q->kernel_if->u.h.header_page,
+                                       retval, false);
                err = VMCI_ERROR_NO_MEM;
                goto out;
        }
@@ -683,8 +684,9 @@ static int qp_host_get_user_memory(u64 produce_uva,
        if (retval < (int)consume_q->kernel_if->num_pages) {
                pr_debug("get_user_pages_fast(consume) failed (retval=%d)",
                        retval);
-               qp_release_pages(consume_q->kernel_if->u.h.header_page,
-                                retval, false);
+               if (retval > 0)
+                       qp_release_pages(consume_q->kernel_if->u.h.header_page,
+                                       retval, false);
                qp_release_pages(produce_q->kernel_if->u.h.header_page,
                                 produce_q->kernel_if->num_pages, false);
                err = VMCI_ERROR_NO_MEM;