On 08/28/2015 05:31 AM, Lee Jones wrote:
> +static ssize_t rproc_state_write(struct file *filp, const char __user 
> *userbuf,
> +                              size_t count, loff_t *ppos)
> +{
> +     struct rproc *rproc = filp->private_data;
> +     char buf[2];
> +     int ret;
> +
> +     ret = copy_from_user(buf, userbuf, 1);
> +     if (ret)
> +             return -EFAULT;
> +
> +     switch (buf[0]) {
> +     case '0':
> +             rproc_shutdown(rproc);
> +             break;
> +     case '1':
> +             ret = rproc_boot(rproc);
> +             if (ret)
> +                     dev_warn(&rproc->dev, "Boot failed: %d\n", ret);
> +             break;
> +     default:
> +             dev_err(&rproc->dev, "Unrecognised option: %x\n", buf[1]);
> +             return -EINVAL;

This prints uninitialized kernel stack contents instead of what was
copied from user space.

Is the dev_err statement really necessary anyway?


> +     }
> +
> +     return count;
> +}

If rproc_boot fails, that should be reflected in the syscall result.

This interface is essentially exposing the remoteproc->power refcount to
user space; is that okay?  Seems like it makes it easy to underflow
remoteproc->power through successive shutdown calls.

The other debugfs interface in remoteproc that has a write method
(recovery) accepts more expressive string commands as opposed to 0/1.
It would be more consistent for this interface to take commands such as
"boot" and "shutdown" IMO.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to