diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2016-07-27 01:15:11 +0400 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2016-07-29 00:33:48 +0300 |
commit | c4843a45e3d4f3698b214275ab5e78cdb6a3d212 (patch) | |
tree | 37c8dfe417699cb054f9e7d8a3a1e31980d687d0 /hw/virtio/vhost-user.c | |
parent | 6fab2f3f6064ad0a712c6d9213b9151bcc87c3d6 (diff) | |
download | qemu-c4843a45e3d4f3698b214275ab5e78cdb6a3d212.zip qemu-c4843a45e3d4f3698b214275ab5e78cdb6a3d212.tar.gz qemu-c4843a45e3d4f3698b214275ab5e78cdb6a3d212.tar.bz2 |
vhost-user: check vhost_user_{read,write}() return value
The vhost-user code is quite inconsistent with error handling. Instead
of ignoring some return values of read/write and silently going on with
invalid state (invalid read for example), break the code flow when the
error happened.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio/vhost-user.c')
-rw-r--r-- | hw/virtio/vhost-user.c | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 5dae496..819481d 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -214,12 +214,14 @@ static int vhost_user_set_log_base(struct vhost_dev *dev, uint64_t base, fds[fd_num++] = log->fd; } - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } if (shmfd) { msg.size = 0; if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } if (msg.request != VHOST_USER_SET_LOG_BASE) { @@ -275,7 +277,9 @@ static int vhost_user_set_mem_table(struct vhost_dev *dev, msg.size += sizeof(msg.payload.memory.padding); msg.size += fd_num * sizeof(VhostUserMemoryRegion); - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } return 0; } @@ -290,7 +294,9 @@ static int vhost_user_set_vring_addr(struct vhost_dev *dev, .size = sizeof(msg.payload.addr), }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } return 0; } @@ -313,7 +319,9 @@ static int vhost_set_vring(struct vhost_dev *dev, .size = sizeof(msg.payload.state), }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } return 0; } @@ -360,10 +368,12 @@ static int vhost_user_get_vring_base(struct vhost_dev *dev, .size = sizeof(msg.payload.state), }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } if (msg.request != VHOST_USER_GET_VRING_BASE) { @@ -401,7 +411,9 @@ static int vhost_set_vring_file(struct vhost_dev *dev, msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK; } - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } return 0; } @@ -427,7 +439,9 @@ static int vhost_user_set_u64(struct vhost_dev *dev, int request, uint64_t u64) .size = sizeof(msg.payload.u64), }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } return 0; } @@ -455,10 +469,12 @@ static int vhost_user_get_u64(struct vhost_dev *dev, int request, uint64_t *u64) return 0; } - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } if (msg.request != request) { @@ -489,7 +505,9 @@ static int vhost_user_set_owner(struct vhost_dev *dev) .flags = VHOST_USER_VERSION, }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } return 0; } @@ -501,7 +519,9 @@ static int vhost_user_reset_device(struct vhost_dev *dev) .flags = VHOST_USER_VERSION, }; - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } return 0; } @@ -588,7 +608,6 @@ static bool vhost_user_requires_shm_log(struct vhost_dev *dev) static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr) { VhostUserMsg msg = { 0 }; - int err; assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER); @@ -605,8 +624,7 @@ static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr) memcpy((char *)&msg.payload.u64, mac_addr, 6); msg.size = sizeof(msg.payload.u64); - err = vhost_user_write(dev, &msg, NULL, 0); - return err; + return vhost_user_write(dev, &msg, NULL, 0); } return -1; } |