diff options
author | Iliyan Malchev <malchev@google.com> | 2011-08-02 16:59:26 -0700 |
---|---|---|
committer | Iliyan Malchev <malchev@google.com> | 2011-08-02 19:24:56 -0700 |
commit | 93ea5148c66669e0eca5ae72681c3630da5a6f14 (patch) | |
tree | 5f8cc3feb36cd5ca2a08d4b90abb209e1946880f | |
parent | 55981a570ae9d4073a98a4d5df92320caeedcf90 (diff) | |
download | kernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.zip kernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.tar.gz kernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.tar.bz2 |
rpmsg: clean up error codes
Do not return -EFAULT to user space for non copy_to/from_user errors.
Signed-off-by: Iliyan Malchev <malchev@google.com>
-rw-r--r-- | drivers/rpmsg/rpmsg_omx.c | 45 | ||||
-rw-r--r-- | drivers/rpmsg/rpmsg_resmgr.c | 6 |
2 files changed, 36 insertions, 15 deletions
diff --git a/drivers/rpmsg/rpmsg_omx.c b/drivers/rpmsg/rpmsg_omx.c index 6315e50..4d71dc3 100644 --- a/drivers/rpmsg/rpmsg_omx.c +++ b/drivers/rpmsg/rpmsg_omx.c @@ -133,7 +133,7 @@ static u32 _rpmsg_omx_buffer_lookup(struct rpmsg_omx_instance *omx, long buffer) static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet) { - int ret = -1, offset = 0; + int ret = -EINVAL, offset = 0; long *buffer; char *data; enum rpc_omx_map_info_type maptype; @@ -163,7 +163,7 @@ static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet) if (!ret && (maptype >= RPC_OMX_MAP_INFO_TWO_BUF)) { buffer = (long *)((int)data + offset + sizeof(*buffer)); if (*buffer != 0) { - ret = -1; + ret = -EIO; pa = _rpmsg_omx_buffer_lookup(omx, *buffer); if (pa) { @@ -176,7 +176,7 @@ static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet) if (!ret && maptype >= RPC_OMX_MAP_INFO_THREE_BUF) { buffer = (long *)((int)data + offset + 2*sizeof(*buffer)); if (*buffer != 0) { - ret = -1; + ret = -EIO; pa = _rpmsg_omx_buffer_lookup(omx, *buffer); if (pa) { *buffer = pa; @@ -310,7 +310,9 @@ long rpmsg_omx_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case OMX_IOCCONNECT: ret = copy_from_user(buf, (char __user *) arg, sizeof(buf)); if (ret) { - dev_err(omxserv->dev, "copy_from_user fail: %d\n", ret); + dev_err(omxserv->dev, + "%s: %d: copy_from_user fail: %d\n", __func__, + _IOC_NR(cmd), ret); ret = -EFAULT; break; } @@ -322,23 +324,39 @@ long rpmsg_omx_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case OMX_IOCIONREGISTER: { struct ion_fd_data data; - if (copy_from_user(&data, (char __user *) arg, sizeof(data))) + if (copy_from_user(&data, (char __user *) arg, sizeof(data))) { + dev_err(omxserv->dev, + "%s: %d: copy_from_user fail: %d\n", __func__, + _IOC_NR(cmd), ret); return -EFAULT; + } data.handle = ion_import_fd(omx->ion_client, data.fd); if (IS_ERR(data.handle)) data.handle = NULL; - if (copy_to_user(&data, (char __user *) arg, sizeof(data))) + if (copy_to_user(&data, (char __user *) arg, sizeof(data))) { + dev_err(omxserv->dev, + "%s: %d: copy_to_user fail: %d\n", __func__, + _IOC_NR(cmd), ret); return -EFAULT; + } break; } case OMX_IOCIONUNREGISTER: { struct ion_fd_data data; - if (copy_from_user(&data, (char __user *) arg, sizeof(data))) + if (copy_from_user(&data, (char __user *) arg, sizeof(data))) { + dev_err(omxserv->dev, + "%s: %d: copy_from_user fail: %d\n", __func__, + _IOC_NR(cmd), ret); return -EFAULT; + } ion_free(omx->ion_client, data.handle); - if (copy_to_user(&data, (char __user *) arg, sizeof(data))) + if (copy_to_user(&data, (char __user *) arg, sizeof(data))) { + dev_err(omxserv->dev, + "%s: %d: copy_to_user fail: %d\n", __func__, + _IOC_NR(cmd), ret); return -EFAULT; + } break; } #endif @@ -458,15 +476,17 @@ static ssize_t rpmsg_omx_read(struct file *filp, char __user *buf, skb = skb_dequeue(&omx->queue); if (!skb) { dev_err(omx->omxserv->dev, "err is rmpsg_omx racy ?\n"); - return -EFAULT; + return -EIO; } mutex_unlock(&omx->lock); use = min(len, skb->len); - if (copy_to_user(buf, skb->data, use)) + if (copy_to_user(buf, skb->data, use)) { + dev_err(omx->omxserv->dev, "%s: copy_to_user fail\n", __func__); use = -EFAULT; + } kfree_skb(skb); return use; @@ -497,8 +517,9 @@ static ssize_t rpmsg_omx_write(struct file *filp, const char __user *ubuf, if (copy_from_user(hdr->data, ubuf, use)) return -EMSGSIZE; - if (_rpmsg_omx_map_buf(omx, hdr->data)) - return -EFAULT; + ret = _rpmsg_omx_map_buf(omx, hdr->data); + if (ret < 0) + return ret; hdr->type = OMX_RAW_MSG; hdr->flags = 0; diff --git a/drivers/rpmsg/rpmsg_resmgr.c b/drivers/rpmsg/rpmsg_resmgr.c index b9a23c3..d785e89 100644 --- a/drivers/rpmsg/rpmsg_resmgr.c +++ b/drivers/rpmsg/rpmsg_resmgr.c @@ -187,7 +187,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj) acd->aux_clk = clk_get(NULL, clk_name); if (!acd->aux_clk) { pr_err("%s: unable to get clock %s\n", __func__, clk_name); - ret = -EFAULT; + ret = -EIO; goto error; } @@ -198,7 +198,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj) acd->src = clk_get(NULL, src_clk_name); if (!acd->src) { pr_err("%s: unable to get clock %s\n", __func__, src_clk_name); - ret = -EFAULT; + ret = -EIO; goto error_aux; } @@ -206,7 +206,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj) if (!src_parent) { pr_err("%s: unable to get parent clock %s\n", __func__, clk_src_name[obj->parent_src_clk]); - ret = -EFAULT; + ret = -EIO; goto error_aux_src; } |