From 03de0031831d86df81e1d05cbe79fb3d9d003989 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Tue, 3 Feb 2009 07:26:31 +0000 Subject: [PATCH] fix handling of invalid arguments passed by some bootloaders (thanks to Jeff Hansen and to Jonas) SVN-Revision: 14382 --- .../mips/include/asm/mach-ar71xx/ar71xx.h | 3 +++ .../ar71xx/files/arch/mips/ar71xx/prom.c | 21 +++++++++++++++---- .../ar71xx/files/arch/mips/ar71xx/setup.c | 5 +---- .../include/asm-mips/mach-ar71xx/ar71xx.h | 3 +++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/target/linux/ar71xx/files-2.6.28/arch/mips/include/asm/mach-ar71xx/ar71xx.h b/target/linux/ar71xx/files-2.6.28/arch/mips/include/asm/mach-ar71xx/ar71xx.h index 5aba593e29..a4e6ed3ecf 100644 --- a/target/linux/ar71xx/files-2.6.28/arch/mips/include/asm/mach-ar71xx/ar71xx.h +++ b/target/linux/ar71xx/files-2.6.28/arch/mips/include/asm/mach-ar71xx/ar71xx.h @@ -59,6 +59,9 @@ #define AR91XX_WMAC_BASE (AR71XX_APB_BASE + 0x000C0000) #define AR91XX_WMAC_SIZE 0x30000 +#define AR71XX_MEM_SIZE_MIN 0x0200000 +#define AR71XX_MEM_SIZE_MAX 0x8000000 + #define AR71XX_CPU_IRQ_BASE 0 #define AR71XX_MISC_IRQ_BASE 8 #define AR71XX_MISC_IRQ_COUNT 8 diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c index 8e93807ae5..5402e0a543 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c @@ -73,18 +73,31 @@ static struct board_rec boards[] __initdata = { } }; +static inline int is_valid_ram_addr(void *addr) +{ + if (((u32) addr > KSEG0) && + ((u32) addr < (KSEG0 + AR71XX_MEM_SIZE_MAX))) + return 1; + + if (((u32) addr > KSEG1) && + ((u32) addr < (KSEG1 + AR71XX_MEM_SIZE_MAX))) + return 1; + + return 0; +} + static __init char *ar71xx_prom_getargv(const char *name) { int len = strlen(name); int i; - if (!ar71xx_prom_argv) + if (!is_valid_ram_addr(ar71xx_prom_argv)) return NULL; for (i = 0; i < ar71xx_prom_argc; i++) { char *argv = ar71xx_prom_argv[i]; - if (!argv) + if (!is_valid_ram_addr(argv)) continue; if (strncmp(name, argv, len) == 0 && (argv)[len] == '=') @@ -99,10 +112,10 @@ static __init char *ar71xx_prom_getenv(const char *envname) int len = strlen(envname); char **env; - if (!ar71xx_prom_envp) + if (!is_valid_ram_addr(ar71xx_prom_envp)) return NULL; - for (env = ar71xx_prom_envp; *env != NULL; env++) + for (env = ar71xx_prom_envp; is_valid_ram_addr(*env); env++) if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=') return *env + len + 1; diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/setup.c b/target/linux/ar71xx/files/arch/mips/ar71xx/setup.c index a83f7d198b..40b11782df 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/setup.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/setup.c @@ -1,7 +1,7 @@ /* * Atheros AR71xx SoC specific setup * - * Copyright (C) 2008 Gabor Juhos + * Copyright (C) 2008-2009 Gabor Juhos * Copyright (C) 2008 Imre Kaloz * * Parts of this file are based on Atheros' 2.6.15 BSP @@ -33,9 +33,6 @@ #define AR71XX_BASE_FREQ 40000000 #define AR91XX_BASE_FREQ 5000000 -#define AR71XX_MEM_SIZE_MIN 0x0200000 -#define AR71XX_MEM_SIZE_MAX 0x8000000 - unsigned long ar71xx_mach_type; u32 ar71xx_cpu_freq; diff --git a/target/linux/ar71xx/files/include/asm-mips/mach-ar71xx/ar71xx.h b/target/linux/ar71xx/files/include/asm-mips/mach-ar71xx/ar71xx.h index 5aba593e29..a4e6ed3ecf 100644 --- a/target/linux/ar71xx/files/include/asm-mips/mach-ar71xx/ar71xx.h +++ b/target/linux/ar71xx/files/include/asm-mips/mach-ar71xx/ar71xx.h @@ -59,6 +59,9 @@ #define AR91XX_WMAC_BASE (AR71XX_APB_BASE + 0x000C0000) #define AR91XX_WMAC_SIZE 0x30000 +#define AR71XX_MEM_SIZE_MIN 0x0200000 +#define AR71XX_MEM_SIZE_MAX 0x8000000 + #define AR71XX_CPU_IRQ_BASE 0 #define AR71XX_MISC_IRQ_BASE 8 #define AR71XX_MISC_IRQ_COUNT 8