thunderbolt: Prevent crash if non-active NVMem file is read
The driver does not populate .reg_read callback for the non-active NVMem
because the file is supposed to be write-only. However, it turns out
NVMem subsystem does not yet support this and expects that the .reg_read
callback is provided. If user reads the binary attribute it triggers
NULL pointer dereference like this one:
  BUG: kernel NULL pointer dereference, address: 0000000000000000
  ...
  Call Trace:
   bin_attr_nvmem_read+0x64/0x80
   kernfs_fop_read+0xa7/0x180
   vfs_read+0xbd/0x170
   ksys_read+0x5a/0xd0
   do_syscall_64+0x43/0x150
   entry_SYSCALL_64_after_hwframe+0x44/0xa9
Fix this in the driver by providing .reg_read callback that always
returns an error.
Reported-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au>
Fixes: e6b245ccd5 ("thunderbolt: Add support for host and device NVM firmware upgrade")
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20200213095604.1074-1-mika.westerberg@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									d593126a96
								
							
						
					
					
						commit
						03cd45d2e2
					
				| @ -348,6 +348,12 @@ out: | |||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int tb_switch_nvm_no_read(void *priv, unsigned int offset, void *val, | ||||||
|  | 				 size_t bytes) | ||||||
|  | { | ||||||
|  | 	return -EPERM; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int tb_switch_nvm_write(void *priv, unsigned int offset, void *val, | static int tb_switch_nvm_write(void *priv, unsigned int offset, void *val, | ||||||
| 			       size_t bytes) | 			       size_t bytes) | ||||||
| { | { | ||||||
| @ -393,6 +399,7 @@ static struct nvmem_device *register_nvmem(struct tb_switch *sw, int id, | |||||||
| 		config.read_only = true; | 		config.read_only = true; | ||||||
| 	} else { | 	} else { | ||||||
| 		config.name = "nvm_non_active"; | 		config.name = "nvm_non_active"; | ||||||
|  | 		config.reg_read = tb_switch_nvm_no_read; | ||||||
| 		config.reg_write = tb_switch_nvm_write; | 		config.reg_write = tb_switch_nvm_write; | ||||||
| 		config.root_only = true; | 		config.root_only = true; | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user