Re: [PATCH] arm64: mm: Fix "rodata=on" when CONFIG_RODATA_FULL_DEFAULT_ENABLED=y

Will Deacon
2023-11-21T15:04:26Z

On Fri, Nov 17, 2023 at 10:09:04AM -0500, Ard Biesheuvel wrote:
> On Fri, 17 Nov 2023 at 08:14, Will Deacon <will@kernel.org> wrote:
> >
> > 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.
> >
>
> I think this got broken when this code was refactored to use the
> generic parsing, which uses strtobool() and so it will match
> rodata=0/1, yes, no etc, and only 'full' is handled as a special case.

strtobool() is such a hack! I don't think the core code uses it anymore
though: set_debug_rodata() uses good ol' strcmp() since 2e8cff0a0eee
("arm64: fix rodata=full").

> Not sure whether this matters, and I'd much prefer supporting only
> 'on', 'off' and 'full' because we'll need to parse rodata= early too
> (for my big head.S / LPA2 refactor).

I think that matches the current behaviour (minus the bug I'm fixing here)
and even the documentation in kernel-parameters.txt only talks about those
three values.

Will