| From 9cc3d0c6915aee5140f8335d41bbc3ff1b79aa4e Mon Sep 17 00:00:00 2001 |
| From: Mark Rutland <mark.rutland@arm.com> |
| Date: Tue, 14 Apr 2020 11:42:48 +0100 |
| Subject: arm64: vdso: don't free unallocated pages |
| |
| From: Mark Rutland <mark.rutland@arm.com> |
| |
| commit 9cc3d0c6915aee5140f8335d41bbc3ff1b79aa4e upstream. |
| |
| The aarch32_vdso_pages[] array never has entries allocated in the C_VVAR |
| or C_VDSO slots, and as the array is zero initialized these contain |
| NULL. |
| |
| However in __aarch32_alloc_vdso_pages() when |
| aarch32_alloc_kuser_vdso_page() fails we attempt to free the page whose |
| struct page is at NULL, which is obviously nonsensical. |
| |
| This patch removes the erroneous page freeing. |
| |
| Fixes: 7c1deeeb0130 ("arm64: compat: VDSO setup for compat layer") |
| Cc: <stable@vger.kernel.org> # 5.3.x- |
| Cc: Vincenzo Frascino <vincenzo.frascino@arm.com> |
| Acked-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Mark Rutland <mark.rutland@arm.com> |
| Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm64/kernel/vdso.c | 13 +------------ |
| 1 file changed, 1 insertion(+), 12 deletions(-) |
| |
| --- a/arch/arm64/kernel/vdso.c |
| +++ b/arch/arm64/kernel/vdso.c |
| @@ -260,18 +260,7 @@ static int __aarch32_alloc_vdso_pages(vo |
| if (ret) |
| return ret; |
| |
| - ret = aarch32_alloc_kuser_vdso_page(); |
| - if (ret) { |
| - unsigned long c_vvar = |
| - (unsigned long)page_to_virt(aarch32_vdso_pages[C_VVAR]); |
| - unsigned long c_vdso = |
| - (unsigned long)page_to_virt(aarch32_vdso_pages[C_VDSO]); |
| - |
| - free_page(c_vvar); |
| - free_page(c_vdso); |
| - } |
| - |
| - return ret; |
| + return aarch32_alloc_kuser_vdso_page(); |
| } |
| #else |
| static int __aarch32_alloc_vdso_pages(void) |