diff options
| -rw-r--r-- | drivers/platform/chrome/cros_ec_dev.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/platform/chrome/cros_ec_dev.c b/drivers/platform/chrome/cros_ec_dev.c index 6d8ee3b15872..8abd80dbcbed 100644 --- a/drivers/platform/chrome/cros_ec_dev.c +++ b/drivers/platform/chrome/cros_ec_dev.c | |||
| @@ -151,13 +151,19 @@ static long ec_device_ioctl_xcmd(struct cros_ec_dev *ec, void __user *arg) | |||
| 151 | goto exit; | 151 | goto exit; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | if (u_cmd.outsize != s_cmd->outsize || | ||
| 155 | u_cmd.insize != s_cmd->insize) { | ||
| 156 | ret = -EINVAL; | ||
| 157 | goto exit; | ||
| 158 | } | ||
| 159 | |||
| 154 | s_cmd->command += ec->cmd_offset; | 160 | s_cmd->command += ec->cmd_offset; |
| 155 | ret = cros_ec_cmd_xfer(ec->ec_dev, s_cmd); | 161 | ret = cros_ec_cmd_xfer(ec->ec_dev, s_cmd); |
| 156 | /* Only copy data to userland if data was received. */ | 162 | /* Only copy data to userland if data was received. */ |
| 157 | if (ret < 0) | 163 | if (ret < 0) |
| 158 | goto exit; | 164 | goto exit; |
| 159 | 165 | ||
| 160 | if (copy_to_user(arg, s_cmd, sizeof(*s_cmd) + u_cmd.insize)) | 166 | if (copy_to_user(arg, s_cmd, sizeof(*s_cmd) + s_cmd->insize)) |
| 161 | ret = -EFAULT; | 167 | ret = -EFAULT; |
| 162 | exit: | 168 | exit: |
| 163 | kfree(s_cmd); | 169 | kfree(s_cmd); |
