Skip to content

Commit 4ef949e

Browse files
Andre-ARMtrini
authored andcommitted
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 <[email protected]> Acked-by: Ilias Apalodimas <[email protected]>
1 parent 530fc5c commit 4ef949e

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

env/fat.c

+6-8
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,12 @@ __weak const char *env_fat_get_intf(void)
4141
__weak char *env_fat_get_dev_part(void)
4242
{
4343
#ifdef CONFIG_MMC
44-
static char *part_str;
45-
46-
if (!part_str) {
47-
part_str = CONFIG_ENV_FAT_DEVICE_AND_PART;
48-
if (!strcmp(CONFIG_ENV_FAT_INTERFACE, "mmc") && part_str[0] == ':') {
49-
part_str = "0" CONFIG_ENV_FAT_DEVICE_AND_PART;
50-
part_str[0] += mmc_get_env_dev();
51-
}
44+
/* reserve one more char for the manipulation below */
45+
static char part_str[] = CONFIG_ENV_FAT_DEVICE_AND_PART "\0";
46+
47+
if (!strcmp(CONFIG_ENV_FAT_INTERFACE, "mmc") && part_str[0] == ':') {
48+
part_str[0] = '0' + mmc_get_env_dev();
49+
strcpy(&part_str[1], CONFIG_ENV_FAT_DEVICE_AND_PART);
5250
}
5351

5452
return part_str;

0 commit comments

Comments
 (0)