aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSwapnil Ingle <swapnil.ingle@nutanix.com>2019-11-06 08:14:38 -0500
committerSwapnil Ingle <swapnil.ingle@nutanix.com>2019-11-06 09:56:54 -0500
commit5153d44b5370b4728b87afacdad17474be444efd (patch)
treeca56f21e7526fddda1e0d03323cf32fcf2e52c7b
parentadd5efb8913e8292e670de861126b68df4495cfe (diff)
downloadlibvfio-user-5153d44b5370b4728b87afacdad17474be444efd.zip
libvfio-user-5153d44b5370b4728b87afacdad17474be444efd.tar.gz
libvfio-user-5153d44b5370b4728b87afacdad17474be444efd.tar.bz2
muser, libmuser: Do not abuse muser_cmd.mmap.response to return err
muser_cmd.mmap.response is unsigned and should not be used to return errors, instead use muser_cmd.err Also fixed the code path to use valid errno values. Signed-off-by: Swapnil Ingle <swapnil.ingle@nutanix.com>
-rw-r--r--kmod/muser.c17
-rw-r--r--lib/libmuser.c15
2 files changed, 10 insertions, 22 deletions
diff --git a/kmod/muser.c b/kmod/muser.c
index 54e3e70..7ee5926 100644
--- a/kmod/muser.c
+++ b/kmod/muser.c
@@ -605,7 +605,7 @@ static int muser_process_dma_request(struct muser_dev *mudev,
if (unlikely(err))
return err;
- return mucmd.muser_cmd.mmap.response;
+ return mucmd.muser_cmd.err;
}
static int muser_process_dma_map(struct muser_dev *mudev, int flags)
@@ -1478,9 +1478,6 @@ static inline int mmap_done(struct mudev_cmd * const mucmd)
char __user *addr = (char __user *) cmd->mmap.response;
int ret;
- if (cmd->err < 0)
- return -EINVAL;
-
ret = do_pin_pages(addr, mucmd->mmap_len, 1, &mucmd->pg_map);
if (ret) {
muser_alert("failed to pin pages: %d", ret);
@@ -1497,7 +1494,7 @@ static long libmuser_unl_ioctl(struct file *filep, unsigned int cmd,
struct muser_dev *mudev = filep->private_data;
struct mudev_cmd *mucmd;
unsigned long offset;
- int ret = -EINVAL;
+ int ret = -EINVAL, mucmd_err;
WARN_ON(mudev == NULL);
switch (cmd) {
@@ -1552,6 +1549,7 @@ static long libmuser_unl_ioctl(struct file *filep, unsigned int cmd,
if (ret)
goto out;
+ mucmd_err = mucmd->muser_cmd.err;
switch (mucmd->type) {
case MUSER_IOCTL:
offset = offsetof(struct muser_cmd, ioctl);
@@ -1559,13 +1557,12 @@ static long libmuser_unl_ioctl(struct file *filep, unsigned int cmd,
ret = bounce_in(mucmd, (void __user *)(arg + offset));
break;
case MUSER_MMAP:
- ret = mmap_done(mucmd);
+ if (!mucmd_err)
+ ret = mmap_done(mucmd);
break;
case MUSER_READ:
- if (mucmd->muser_cmd.err < 0) {
- muser_alert("read failed: %d",
- mucmd->muser_cmd.err);
- }
+ if (mucmd_err < 0)
+ muser_alert("read failed: %d", mucmd_err);
break;
case MUSER_WRITE:
case MUSER_DMA_MMAP:
diff --git a/lib/libmuser.c b/lib/libmuser.c
index fcfdfd2..4233023 100644
--- a/lib/libmuser.c
+++ b/lib/libmuser.c
@@ -540,8 +540,7 @@ muser_dma_unmap(lm_ctx_t *lm_ctx, struct muser_cmd *cmd)
if (lm_ctx->dma == NULL) {
lm_log(lm_ctx, LM_ERR, "DMA not initialized\n");
- cmd->mmap.response = -1;
- return -1;
+ return -EINVAL;
}
err = dma_controller_remove_region(lm_ctx->dma,
@@ -553,8 +552,6 @@ muser_dma_unmap(lm_ctx_t *lm_ctx, struct muser_cmd *cmd)
cmd->mmap.request.len, cmd->mmap.request.addr, strerror(err));
}
- cmd->mmap.response = err;
-
return err;
}
@@ -568,8 +565,7 @@ muser_dma_map(lm_ctx_t *lm_ctx, struct muser_cmd *cmd)
if (lm_ctx->dma == NULL) {
lm_log(lm_ctx, LM_ERR, "DMA not initialized\n");
- cmd->mmap.response = -1;
- return -1;
+ return -EINVAL;
}
err = dma_controller_add_region(lm_ctx, lm_ctx->dma,
@@ -579,12 +575,9 @@ muser_dma_map(lm_ctx_t *lm_ctx, struct muser_cmd *cmd)
if (err < 0) {
lm_log(lm_ctx, LM_ERR, "failed to add DMA region %#lx@%#lx: %d\n",
cmd->mmap.request.len, cmd->mmap.request.addr, err);
- cmd->mmap.response = -1;
- return -1;
+ return err;
}
- cmd->mmap.response = 0;
-
return 0;
}
@@ -624,8 +617,6 @@ out:
if (err != 0) {
lm_log(lm_ctx, LM_ERR, "failed to mmap device memory %#x@%#lx: %s\n",
len, offset, strerror(-errno));
- cmd->err = err;
- err = -1;
}
return err;