env: fat: Avoid writing to read-only location
authorAndre Przywara <andre.przywara@arm.com>
Thu, 30 Jan 2025 13:36:46 +0000 (13:36 +0000)
committerTom Rini <trini@konsulko.com>
Mon, 10 Feb 2025 16:29:53 +0000 (10:29 -0600)
commit4ef949eedc2d7bb136ac7a33fb7a072c439e2171
tree2205e831a8344ffc511bb6ab85c7129c125c5147
parent530fc5c9e5670be62b3183cd54b42e5169d19fdf
env: fat: Avoid writing to read-only location

The env_fat_get_dev_part() function mostly returns a fixed string, set
via some Kconfig variable. However when the first character is a colon,
that means that the boot device number is determined at runtime, and
patched in. This requires altering the string.

So far this was done via some ugly and actually illegal direct write to
the .rodata string storage. We got away with this because U-Boot maps
everything as read/write/execute so far.

A proposed patch set actually enforces read-only (and no-execute)
permissions in the page tables, so this routine now causes an exception:
=======================
Loading Environment from FAT... "Synchronous Abort" handler, esr 0x9600004f, far 0xfffb7d4c
elr: 000000004a054228 lr : 000000004a05421c (reloc)
elr: 00000000fff7c228 lr : 00000000fff7c21c
.....
=======================

Rewrite the routine to do away with the dodgy string manipulation,
instead allocate the string in the r/w .data section, where we can
safely manipulate it.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
env/fat.c