Skip to content

Commit

Permalink
arm64: mm: Fix "rodata=on" when CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
Browse files Browse the repository at this point in the history
[ Upstream commit acfa60d ]

When CONFIG_RODATA_FULL_DEFAULT_ENABLED=y, passing "rodata=on" on the
kernel command-line (rather than "rodata=full") should turn off the
"full" behaviour, leaving writable linear aliases of read-only kernel
memory. Unfortunately, the option has no effect in this situation and
the only way to disable the "rodata=full" behaviour is to disable rodata
protection entirely by passing "rodata=off".

Fix this by parsing the "on" and "off" options in the arch code,
additionally enforcing that 'rodata_full' cannot be set without also
setting 'rodata_enabled', allowing us to simplify a couple of checks
in the process.

Fixes: 2e8cff0 ("arm64: fix rodata=full")
Cc: Ard Biesheuvel <[email protected]>
Cc: Mark Rutland <[email protected]>
Signed-off-by: Will Deacon <[email protected]>
Reviewed-by: "Russell King (Oracle)" <[email protected]>
Reviewed-by: Ard Biesheuvel <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Catalin Marinas <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
willdeacon authored and gregkh committed Dec 3, 2023
1 parent 322b3f6 commit 1bf3683
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
17 changes: 15 additions & 2 deletions arch/arm64/include/asm/setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,22 @@ static inline bool arch_parse_debug_rodata(char *arg)
extern bool rodata_enabled;
extern bool rodata_full;

if (arg && !strcmp(arg, "full")) {
if (!arg)
return false;

if (!strcmp(arg, "full")) {
rodata_enabled = rodata_full = true;
return true;
}

if (!strcmp(arg, "off")) {
rodata_enabled = rodata_full = false;
return true;
}

if (!strcmp(arg, "on")) {
rodata_enabled = true;
rodata_full = true;
rodata_full = false;
return true;
}

Expand Down
7 changes: 3 additions & 4 deletions arch/arm64/mm/pageattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ bool can_set_direct_map(void)
*
* KFENCE pool requires page-granular mapping if initialized late.
*/
return (rodata_enabled && rodata_full) || debug_pagealloc_enabled() ||
arm64_kfence_can_set_direct_map();
return rodata_full || debug_pagealloc_enabled() ||
arm64_kfence_can_set_direct_map();
}

static int change_page_range(pte_t *ptep, unsigned long addr, void *data)
Expand Down Expand Up @@ -105,8 +105,7 @@ static int change_memory_common(unsigned long addr, int numpages,
* If we are manipulating read-only permissions, apply the same
* change to the linear mapping of the pages that back this VM area.
*/
if (rodata_enabled &&
rodata_full && (pgprot_val(set_mask) == PTE_RDONLY ||
if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY ||
pgprot_val(clear_mask) == PTE_RDONLY)) {
for (i = 0; i < area->nr_pages; i++) {
__change_memory_common((u64)page_address(area->pages[i]),
Expand Down

0 comments on commit 1bf3683

Please sign in to comment.