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

Commit f952d4f3 authored by Kalesh Singh's avatar Kalesh Singh
Browse files

ANDROID: 16K: Fix show maps CFI failure



If the kernel is built CONFIG_CFI_CLANG=y, reading smaps
may cause a panic. This is due to a failed CFI check; which
is triggered becuase the signature of the function pointer for
printing smaps padding VMAs does not match exactly with that
for show_smap().

Fix this by casting the function pointer to the expected type
based on whether printing maps or smaps padding.

Bug: 330117029
Bug: 327600007
Bug: 330767927
Bug: 328266487
Bug: 329803029
Change-Id: I65564a547dacbc4131f8557344c8c96e51f90cd5
Signed-off-by: default avatarKalesh Singh <kaleshsingh@google.com>
parent ecba20dd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -426,7 +426,7 @@ static int show_map(struct seq_file *m, void *v)
	if (vma_pages(vma))
		show_map_vma(m, vma);

	show_map_pad_vma(vma, pad_vma, m, show_map_vma);
	show_map_pad_vma(vma, pad_vma, m, show_map_vma, false);

	m_cache_vma(m, v);
	return 0;
@@ -924,7 +924,7 @@ static int show_smap(struct seq_file *m, void *v)
	if (vma_pages(vma))
		show_smap_vma(m, vma);

	show_map_pad_vma(vma, pad_vma, m, (show_pad_vma_fn)show_smap_vma);
	show_map_pad_vma(vma, pad_vma, m, show_smap_vma, true);

	m_cache_vma(m, v);
	return 0;
+2 −4
Original line number Diff line number Diff line
@@ -43,8 +43,6 @@
#define VM_PAD_MASK		(VM_TOTAL_PAD_PAGES << VM_PAD_SHIFT)
#define VMA_PAD_START(vma)	(vma->vm_end - (vma_pad_pages(vma) << PAGE_SHIFT))

typedef void (*show_pad_vma_fn)(struct seq_file *m, struct vm_area_struct *vma);

#if PAGE_SIZE == SZ_4K && defined(CONFIG_64BIT)
extern void vma_set_pad_pages(struct vm_area_struct *vma,
			      unsigned long nr_pages);
@@ -60,7 +58,7 @@ extern struct vm_area_struct *get_data_vma(struct vm_area_struct *vma);

extern void show_map_pad_vma(struct vm_area_struct *vma,
			     struct vm_area_struct *pad,
			     struct seq_file *m, show_pad_vma_fn func);
			     struct seq_file *m, void *func, bool smaps);

extern void split_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *new,
			  unsigned long addr, int new_below);
@@ -92,7 +90,7 @@ static inline struct vm_area_struct *get_data_vma(struct vm_area_struct *vma)

static inline void show_map_pad_vma(struct vm_area_struct *vma,
				    struct vm_area_struct *pad,
				    struct seq_file *m, show_pad_vma_fn func)
				    struct seq_file *m, void *func, bool smaps)
{
}

+8 −2
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@
#include <linux/slab.h>
#include <linux/sysfs.h>

typedef void (*show_pad_maps_fn)	(struct seq_file *m, struct vm_area_struct *vma);
typedef void (*show_pad_smaps_fn)	(struct seq_file *m, void *v);

#ifdef CONFIG_64BIT
#if PAGE_SIZE == SZ_4K
DEFINE_STATIC_KEY_TRUE(pgsize_migration_enabled);
@@ -304,7 +307,7 @@ struct vm_area_struct *get_data_vma(struct vm_area_struct *vma)
 * and @pad.
 */
void show_map_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *pad,
		      struct seq_file *m, show_pad_vma_fn func)
		      struct seq_file *m, void *func, bool smaps)
{
	if (!pad)
		return;
@@ -321,7 +324,10 @@ void show_map_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *pad,
	 */
	BUG_ON(!vma);

	func(m, pad);
	if (smaps)
		((show_pad_smaps_fn)func)(m, pad);
	else
		((show_pad_maps_fn)func)(m, pad);

	kfree(pad);
	kfree(vma);