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: 383389169
Bug: 330117029
Bug: 327600007
Bug: 330767927
Bug: 328266487
Bug: 329803029
Change-Id: I65564a547dacbc4131f8557344c8c96e51f90cd5
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
This commit is contained in:
Kalesh Singh
2024-04-30 13:42:47 -07:00
committed by Carlos Llamas
parent 95d0b11a65
commit 6e64e9ce1f
3 changed files with 12 additions and 8 deletions
+2 -2
View File
@@ -372,7 +372,7 @@ static int show_map(struct seq_file *m, void *v)
if (vma_pages(vma)) if (vma_pages(vma))
show_map_vma(m, 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);
return 0; return 0;
} }
@@ -1186,7 +1186,7 @@ static int show_smap(struct seq_file *m, void *v)
show_smap_vma_flags(m, vma); show_smap_vma_flags(m, vma);
show_pad: show_pad:
show_map_pad_vma(vma, pad_vma, m, (show_pad_vma_fn)((void*)show_smap)); show_map_pad_vma(vma, pad_vma, m, show_smap, true);
return 0; return 0;
} }
+2 -4
View File
@@ -43,8 +43,6 @@
#define VM_PAD_MASK (VM_TOTAL_PAD_PAGES << VM_PAD_SHIFT) #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)) #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) #if PAGE_SIZE == SZ_4K && defined(CONFIG_64BIT)
extern void vma_set_pad_pages(struct vm_area_struct *vma, extern void vma_set_pad_pages(struct vm_area_struct *vma,
unsigned long nr_pages); 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, extern void show_map_pad_vma(struct vm_area_struct *vma,
struct vm_area_struct *pad, 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, extern void split_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *new,
unsigned long addr, int new_below); 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, static inline void show_map_pad_vma(struct vm_area_struct *vma,
struct vm_area_struct *pad, struct vm_area_struct *pad,
struct seq_file *m, show_pad_vma_fn func) struct seq_file *m, void *func, bool smaps)
{ {
} }
+8 -2
View File
@@ -20,6 +20,9 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
typedef void (*show_pad_maps_fn) (struct seq_file *m, struct vm_area_struct *vma);
typedef int (*show_pad_smaps_fn) (struct seq_file *m, void *v);
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#if PAGE_SIZE == SZ_4K #if PAGE_SIZE == SZ_4K
DEFINE_STATIC_KEY_TRUE(pgsize_migration_enabled); DEFINE_STATIC_KEY_TRUE(pgsize_migration_enabled);
@@ -303,7 +306,7 @@ struct vm_area_struct *get_data_vma(struct vm_area_struct *vma)
* and @pad. * and @pad.
*/ */
void show_map_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *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) if (!pad)
return; return;
@@ -320,7 +323,10 @@ void show_map_pad_vma(struct vm_area_struct *vma, struct vm_area_struct *pad,
*/ */
BUG_ON(!vma); 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(pad);
kfree(vma); kfree(vma);