Skip to content

Commit

Permalink
watchdog: ts72xx_wdt: cleanup return codes in ioctl
Browse files Browse the repository at this point in the history
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: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
--
  • Loading branch information
Dan Carpenter authored and Wim Van Sebroeck committed Nov 17, 2013
1 parent cfff96e commit a20a99f
Showing 1 changed file with 16 additions and 20 deletions.
36 changes: 16 additions & 20 deletions drivers/watchdog/ts72xx_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;

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

case WDIOC_SETTIMEOUT: {
int new_timeout;
int regval;

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

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

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

/*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:
Expand Down

0 comments on commit a20a99f

Please sign in to comment.