Input: uinput - breaks by goto out in uinput_ioctl_handler
The current implementation prevents us to add variable-length ioctl. Use a bunch of gotos instead of break to allow us to do so. No functional changes. Signed-off-by: Benjamin Tisssoires <benjamin.tissoires@redhat.com> Reviewed-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
		
							parent
							
								
									6f2e6c9b45
								
							
						
					
					
						commit
						9d51e801db
					
				| @ -693,51 +693,51 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd, | ||||
| 	switch (cmd) { | ||||
| 		case UI_DEV_CREATE: | ||||
| 			retval = uinput_create_device(udev); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_DEV_DESTROY: | ||||
| 			uinput_destroy_device(udev); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_EVBIT: | ||||
| 			retval = uinput_set_bit(arg, evbit, EV_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_KEYBIT: | ||||
| 			retval = uinput_set_bit(arg, keybit, KEY_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_RELBIT: | ||||
| 			retval = uinput_set_bit(arg, relbit, REL_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_ABSBIT: | ||||
| 			retval = uinput_set_bit(arg, absbit, ABS_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_MSCBIT: | ||||
| 			retval = uinput_set_bit(arg, mscbit, MSC_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_LEDBIT: | ||||
| 			retval = uinput_set_bit(arg, ledbit, LED_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_SNDBIT: | ||||
| 			retval = uinput_set_bit(arg, sndbit, SND_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_FFBIT: | ||||
| 			retval = uinput_set_bit(arg, ffbit, FF_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_SWBIT: | ||||
| 			retval = uinput_set_bit(arg, swbit, SW_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_PROPBIT: | ||||
| 			retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_SET_PHYS: | ||||
| 			if (udev->state == UIST_CREATED) { | ||||
| @ -753,18 +753,18 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd, | ||||
| 
 | ||||
| 			kfree(udev->dev->phys); | ||||
| 			udev->dev->phys = phys; | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_BEGIN_FF_UPLOAD: | ||||
| 			retval = uinput_ff_upload_from_user(p, &ff_up); | ||||
| 			if (retval) | ||||
| 				break; | ||||
| 				goto out; | ||||
| 
 | ||||
| 			req = uinput_request_find(udev, ff_up.request_id); | ||||
| 			if (!req || req->code != UI_FF_UPLOAD || | ||||
| 			    !req->u.upload.effect) { | ||||
| 				retval = -EINVAL; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			ff_up.retval = 0; | ||||
| @ -775,65 +775,63 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd, | ||||
| 				memset(&ff_up.old, 0, sizeof(struct ff_effect)); | ||||
| 
 | ||||
| 			retval = uinput_ff_upload_to_user(p, &ff_up); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_BEGIN_FF_ERASE: | ||||
| 			if (copy_from_user(&ff_erase, p, sizeof(ff_erase))) { | ||||
| 				retval = -EFAULT; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			req = uinput_request_find(udev, ff_erase.request_id); | ||||
| 			if (!req || req->code != UI_FF_ERASE) { | ||||
| 				retval = -EINVAL; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			ff_erase.retval = 0; | ||||
| 			ff_erase.effect_id = req->u.effect_id; | ||||
| 			if (copy_to_user(p, &ff_erase, sizeof(ff_erase))) { | ||||
| 				retval = -EFAULT; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_END_FF_UPLOAD: | ||||
| 			retval = uinput_ff_upload_from_user(p, &ff_up); | ||||
| 			if (retval) | ||||
| 				break; | ||||
| 				goto out; | ||||
| 
 | ||||
| 			req = uinput_request_find(udev, ff_up.request_id); | ||||
| 			if (!req || req->code != UI_FF_UPLOAD || | ||||
| 			    !req->u.upload.effect) { | ||||
| 				retval = -EINVAL; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			req->retval = ff_up.retval; | ||||
| 			uinput_request_done(udev, req); | ||||
| 			break; | ||||
| 			goto out; | ||||
| 
 | ||||
| 		case UI_END_FF_ERASE: | ||||
| 			if (copy_from_user(&ff_erase, p, sizeof(ff_erase))) { | ||||
| 				retval = -EFAULT; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			req = uinput_request_find(udev, ff_erase.request_id); | ||||
| 			if (!req || req->code != UI_FF_ERASE) { | ||||
| 				retval = -EINVAL; | ||||
| 				break; | ||||
| 				goto out; | ||||
| 			} | ||||
| 
 | ||||
| 			req->retval = ff_erase.retval; | ||||
| 			uinput_request_done(udev, req); | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			retval = -EINVAL; | ||||
| 			goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	retval = -EINVAL; | ||||
|  out: | ||||
| 	mutex_unlock(&udev->mutex); | ||||
| 	return retval; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user