mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	firmware: raspberrypi: Remove VLA usage
In the quest to remove all stack VLA usage from the kernel[1], this
removes the VLA in favor of a maximum size and adds a sanity check.
Existing callers of the firmware interface never need more than 24
bytes (struct gpio_set_config). This chooses 32 just to stay ahead
of future growth.
v2: Fix the length passed to rpi_firmware_property_list (by anholt,
    acked by Kees).
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
			
			
This commit is contained in:
		
							parent
							
								
									70eea1bbb5
								
							
						
					
					
						commit
						a1547e0bca
					
				
					 1 changed files with 8 additions and 2 deletions
				
			
		|  | @ -21,6 +21,8 @@ | ||||||
| #define MBOX_DATA28(msg)		((msg) & ~0xf) | #define MBOX_DATA28(msg)		((msg) & ~0xf) | ||||||
| #define MBOX_CHAN_PROPERTY		8 | #define MBOX_CHAN_PROPERTY		8 | ||||||
| 
 | 
 | ||||||
|  | #define MAX_RPI_FW_PROP_BUF_SIZE	32 | ||||||
|  | 
 | ||||||
| static struct platform_device *rpi_hwmon; | static struct platform_device *rpi_hwmon; | ||||||
| 
 | 
 | ||||||
| struct rpi_firmware { | struct rpi_firmware { | ||||||
|  | @ -145,18 +147,22 @@ int rpi_firmware_property(struct rpi_firmware *fw, | ||||||
| 	/* Single tags are very small (generally 8 bytes), so the
 | 	/* Single tags are very small (generally 8 bytes), so the
 | ||||||
| 	 * stack should be safe. | 	 * stack should be safe. | ||||||
| 	 */ | 	 */ | ||||||
| 	u8 data[buf_size + sizeof(struct rpi_firmware_property_tag_header)]; | 	u8 data[sizeof(struct rpi_firmware_property_tag_header) + | ||||||
|  | 		MAX_RPI_FW_PROP_BUF_SIZE]; | ||||||
| 	struct rpi_firmware_property_tag_header *header = | 	struct rpi_firmware_property_tag_header *header = | ||||||
| 		(struct rpi_firmware_property_tag_header *)data; | 		(struct rpi_firmware_property_tag_header *)data; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
|  | 	if (WARN_ON(buf_size > sizeof(data) - sizeof(*header))) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
| 	header->tag = tag; | 	header->tag = tag; | ||||||
| 	header->buf_size = buf_size; | 	header->buf_size = buf_size; | ||||||
| 	header->req_resp_size = 0; | 	header->req_resp_size = 0; | ||||||
| 	memcpy(data + sizeof(struct rpi_firmware_property_tag_header), | 	memcpy(data + sizeof(struct rpi_firmware_property_tag_header), | ||||||
| 	       tag_data, buf_size); | 	       tag_data, buf_size); | ||||||
| 
 | 
 | ||||||
| 	ret = rpi_firmware_property_list(fw, &data, sizeof(data)); | 	ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header)); | ||||||
| 	memcpy(tag_data, | 	memcpy(tag_data, | ||||||
| 	       data + sizeof(struct rpi_firmware_property_tag_header), | 	       data + sizeof(struct rpi_firmware_property_tag_header), | ||||||
| 	       buf_size); | 	       buf_size); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Kees Cook
						Kees Cook