Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91d86314 authored by Greg Hackmann's avatar Greg Hackmann Committed by Dmitry Shmidt
Browse files

ANDROID: arm64: check for upper PAGE_SHIFT bits in pfn_valid()



pfn_valid() returns a false positive when the lower (64 - PAGE_SHIFT)
bits match a valid pfn but some of the upper bits are set.  This caused
a kernel panic in kpageflags_read() when a userspace utility parsed
/proc/*/pagemap, neglected to discard the upper flag bits, and tried to
lseek()+read() from the corresponding offset in /proc/kpageflags.

A valid pfn will never have the upper PAGE_SHIFT bits set, so simply
check for this before passing the pfn to memblock_is_memory().

Change-Id: Ief5d8cd4dd93cbecd545a634a8d5885865cb5970
Signed-off-by: default avatarGreg Hackmann <ghackmann@google.com>
parent f556868a
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -145,9 +145,11 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
#endif /* CONFIG_NUMA */

#ifdef CONFIG_HAVE_ARCH_PFN_VALID
#define PFN_MASK ((1UL << (64 - PAGE_SHIFT)) - 1)

int pfn_valid(unsigned long pfn)
{
	return memblock_is_map_memory(pfn << PAGE_SHIFT);
	return (pfn & PFN_MASK) == pfn && memblock_is_map_memory(pfn << PAGE_SHIFT);
}
EXPORT_SYMBOL(pfn_valid);
#endif