| From 9276b19f1ed52a7a9f07161c90c01af5ea837afd Mon Sep 17 00:00:00 2001 |
| From: Navid Emamdoost <navid.emamdoost@gmail.com> |
| Date: Sat, 4 Jan 2020 13:00:12 -0800 |
| Subject: [PATCH] mm/gup: fix memory leak in __gup_benchmark_ioctl |
| |
| commit a7c46c0c0e3d62f2764cd08b90934cd2aaaf8545 upstream. |
| |
| In the implementation of __gup_benchmark_ioctl() the allocated pages |
| should be released before returning in case of an invalid cmd. Release |
| pages via kvfree(). |
| |
| [akpm@linux-foundation.org: rework code flow, return -EINVAL rather than -1] |
| Link: http://lkml.kernel.org/r/20191211174653.4102-1-navid.emamdoost@gmail.com |
| Fixes: 714a3a1ebafe ("mm/gup_benchmark.c: add additional pinning methods") |
| Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com> |
| Reviewed-by: Andrew Morton <akpm@linux-foundation.org> |
| Reviewed-by: Ira Weiny <ira.weiny@intel.com> |
| Reviewed-by: John Hubbard <jhubbard@nvidia.com> |
| Cc: Keith Busch <keith.busch@intel.com> |
| Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Cc: Dave Hansen <dave.hansen@intel.com> |
| Cc: Dan Williams <dan.j.williams@intel.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/mm/gup_benchmark.c b/mm/gup_benchmark.c |
| index 7dd602d7f8db..ad9d5b1c4473 100644 |
| --- a/mm/gup_benchmark.c |
| +++ b/mm/gup_benchmark.c |
| @@ -26,6 +26,7 @@ static int __gup_benchmark_ioctl(unsigned int cmd, |
| unsigned long i, nr_pages, addr, next; |
| int nr; |
| struct page **pages; |
| + int ret = 0; |
| |
| if (gup->size > ULONG_MAX) |
| return -EINVAL; |
| @@ -63,7 +64,9 @@ static int __gup_benchmark_ioctl(unsigned int cmd, |
| NULL); |
| break; |
| default: |
| - return -1; |
| + kvfree(pages); |
| + ret = -EINVAL; |
| + goto out; |
| } |
| |
| if (nr <= 0) |
| @@ -85,7 +88,8 @@ static int __gup_benchmark_ioctl(unsigned int cmd, |
| gup->put_delta_usec = ktime_us_delta(end_time, start_time); |
| |
| kvfree(pages); |
| - return 0; |
| +out: |
| + return ret; |
| } |
| |
| static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd, |
| -- |
| 2.7.4 |
| |