forked from mirrors/linux
		
	i2c: dev: Check for I2C_FUNC_I2C before calling i2c_transfer
It is good practice to check that the underlying adapter supports I2C transfers before attempting them. The i2c core would eventually return an error, but it's more efficient to fail early. Signed-off-by: Jean Delvare <jdelvare@suse.de> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
This commit is contained in:
		
							parent
							
								
									d08ed10623
								
							
						
					
					
						commit
						97ca843f6a
					
				
					 1 changed files with 12 additions and 0 deletions
				
			
		|  | @ -139,6 +139,10 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count, | ||||||
| 
 | 
 | ||||||
| 	struct i2c_client *client = file->private_data; | 	struct i2c_client *client = file->private_data; | ||||||
| 
 | 
 | ||||||
|  | 	/* Adapter must support I2C transfers */ | ||||||
|  | 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 
 | ||||||
| 	if (count > 8192) | 	if (count > 8192) | ||||||
| 		count = 8192; | 		count = 8192; | ||||||
| 
 | 
 | ||||||
|  | @ -163,6 +167,10 @@ static ssize_t i2cdev_write(struct file *file, const char __user *buf, | ||||||
| 	char *tmp; | 	char *tmp; | ||||||
| 	struct i2c_client *client = file->private_data; | 	struct i2c_client *client = file->private_data; | ||||||
| 
 | 
 | ||||||
|  | 	/* Adapter must support I2C transfers */ | ||||||
|  | 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 
 | ||||||
| 	if (count > 8192) | 	if (count > 8192) | ||||||
| 		count = 8192; | 		count = 8192; | ||||||
| 
 | 
 | ||||||
|  | @ -238,6 +246,10 @@ static noinline int i2cdev_ioctl_rdwr(struct i2c_client *client, | ||||||
| 	u8 __user **data_ptrs; | 	u8 __user **data_ptrs; | ||||||
| 	int i, res; | 	int i, res; | ||||||
| 
 | 
 | ||||||
|  | 	/* Adapter must support I2C transfers */ | ||||||
|  | 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 
 | ||||||
| 	data_ptrs = kmalloc_array(nmsgs, sizeof(u8 __user *), GFP_KERNEL); | 	data_ptrs = kmalloc_array(nmsgs, sizeof(u8 __user *), GFP_KERNEL); | ||||||
| 	if (data_ptrs == NULL) { | 	if (data_ptrs == NULL) { | ||||||
| 		kfree(msgs); | 		kfree(msgs); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jean Delvare
						Jean Delvare