diff options
author | Swapnil Ingle <swapnil.ingle@nutanix.com> | 2019-11-06 08:14:38 -0500 |
---|---|---|
committer | Swapnil Ingle <swapnil.ingle@nutanix.com> | 2019-11-06 09:56:54 -0500 |
commit | 5153d44b5370b4728b87afacdad17474be444efd (patch) | |
tree | ca56f21e7526fddda1e0d03323cf32fcf2e52c7b | |
parent | add5efb8913e8292e670de861126b68df4495cfe (diff) | |
download | libvfio-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.c | 17 | ||||
-rw-r--r-- | lib/libmuser.c | 15 |
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; |