mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	common/memsize.c: Fix get_effective_memsize() to check for overflow
Ensure that top of RAM can be represented by phys_size_t type. If RAM is too large or RAM base address is too upper then limit RAM size to prevent address space overflow. Signed-off-by: Pali Rohár <pali@kernel.org>
This commit is contained in:
		| @@ -94,11 +94,23 @@ long get_ram_size(long *base, long maxsize) | |||||||
|  |  | ||||||
| phys_size_t __weak get_effective_memsize(void) | phys_size_t __weak get_effective_memsize(void) | ||||||
| { | { | ||||||
|  | 	phys_size_t ram_size = gd->ram_size; | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Check for overflow and limit ram size to some representable value. | ||||||
|  | 	 * It is required that ram_base + ram_size must be representable by | ||||||
|  | 	 * phys_size_t type and must be aligned by direct access, therefore | ||||||
|  | 	 * calculate it from last 4kB sector which should work as alignment | ||||||
|  | 	 * on any platform. | ||||||
|  | 	 */ | ||||||
|  | 	if (gd->ram_base + ram_size < gd->ram_base) | ||||||
|  | 		ram_size = ((phys_size_t)~0xfffULL) - gd->ram_base; | ||||||
|  |  | ||||||
| #ifndef CONFIG_MAX_MEM_MAPPED | #ifndef CONFIG_MAX_MEM_MAPPED | ||||||
| 	return gd->ram_size; | 	return ram_size; | ||||||
| #else | #else | ||||||
| 	/* limit stack to what we can reasonable map */ | 	/* limit stack to what we can reasonable map */ | ||||||
| 	return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ? | 	return ((ram_size > CONFIG_MAX_MEM_MAPPED) ? | ||||||
| 		CONFIG_MAX_MEM_MAPPED : gd->ram_size); | 		CONFIG_MAX_MEM_MAPPED : ram_size); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user