Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a20a99fb authored by Dan Carpenter's avatar Dan Carpenter Committed by Wim Van Sebroeck
Browse files

watchdog: ts72xx_wdt: cleanup return codes in ioctl



There seems to be some confusion here which functions return positive
numbers and which return negative error codes.

copy_to_user() returns the number of bytes remaining to be copied but we
want to return -EFAULT.

The rest is just clean up.  get_user() actually returns zero on success
and -EFAULT on error so we can preserve the error code.  The
timeout_to_regval() function returns -EINVAL on failure, but we can
propogate that back instead of hardcoding -EINVAL ourselves.

Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
--
parent cfff96e6
Loading
Loading
Loading
Loading
+16 −20
Original line number Diff line number Diff line
@@ -305,7 +305,8 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,

	switch (cmd) {
	case WDIOC_GETSUPPORT:
		error = copy_to_user(argp, &winfo, sizeof(winfo));
		if (copy_to_user(argp, &winfo, sizeof(winfo)))
			error = -EFAULT;
		break;

	case WDIOC_GETSTATUS:
@@ -320,10 +321,9 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
	case WDIOC_SETOPTIONS: {
		int options;

		if (get_user(options, p)) {
			error = -EFAULT;
		error = get_user(options, p);
		if (error)
			break;
		}

		error = -EINVAL;

@@ -341,30 +341,26 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,

	case WDIOC_SETTIMEOUT: {
		int new_timeout;

		if (get_user(new_timeout, p)) {
			error = -EFAULT;
		} else {
		int regval;

		error = get_user(new_timeout, p);
		if (error)
			break;

		regval = timeout_to_regval(new_timeout);
		if (regval < 0) {
				error = -EINVAL;
			} else {
			error = regval;
			break;
		}
		ts72xx_wdt_stop(wdt);
		wdt->regval = regval;
		ts72xx_wdt_start(wdt);
			}
		}
		if (error)
			break;

		/*FALLTHROUGH*/
	}

	case WDIOC_GETTIMEOUT:
		if (put_user(regval_to_timeout(wdt->regval), p))
			error = -EFAULT;
		error = put_user(regval_to_timeout(wdt->regval), p);
		break;

	default: