From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39554) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSyI2-00068Z-VV for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:16:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSyHx-00034L-Qc for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:16:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47980) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSyHx-00034G-JS for qemu-devel@nongnu.org; Thu, 28 Jul 2016 23:16:41 -0400 Date: Fri, 29 Jul 2016 06:16:38 +0300 From: "Michael S. Tsirkin" Message-ID: <1469762011-7902-28-git-send-email-mst@redhat.com> References: <1469762011-7902-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <1469762011-7902-1-git-send-email-mst@redhat.com> Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 27/41] vhost-user: check vhost_user_{read, write}() return value List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , =?iso-8859-1?Q?Marc-Andr=E9?= Lureau From: Marc-Andr=E9 Lureau 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=E9 Lureau Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- hw/virtio/vhost-user.c | 50 ++++++++++++++++++++++++++++++++++----------= ------ 1 file 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++] =3D log->fd; } =20 - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } =20 if (shmfd) { msg.size =3D 0; if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } =20 if (msg.request !=3D VHOST_USER_SET_LOG_BASE) { @@ -275,7 +277,9 @@ static int vhost_user_set_mem_table(struct vhost_dev = *dev, msg.size +=3D sizeof(msg.payload.memory.padding); msg.size +=3D fd_num * sizeof(VhostUserMemoryRegion); =20 - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } =20 return 0; } @@ -290,7 +294,9 @@ static int vhost_user_set_vring_addr(struct vhost_dev= *dev, .size =3D sizeof(msg.payload.addr), }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 return 0; } @@ -313,7 +319,9 @@ static int vhost_set_vring(struct vhost_dev *dev, .size =3D sizeof(msg.payload.state), }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 return 0; } @@ -360,10 +368,12 @@ static int vhost_user_get_vring_base(struct vhost_d= ev *dev, .size =3D sizeof(msg.payload.state), }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } =20 if (msg.request !=3D VHOST_USER_GET_VRING_BASE) { @@ -401,7 +411,9 @@ static int vhost_set_vring_file(struct vhost_dev *dev= , msg.payload.u64 |=3D VHOST_USER_VRING_NOFD_MASK; } =20 - vhost_user_write(dev, &msg, fds, fd_num); + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { + return -1; + } =20 return 0; } @@ -427,7 +439,9 @@ static int vhost_user_set_u64(struct vhost_dev *dev, = int request, uint64_t u64) .size =3D sizeof(msg.payload.u64), }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 return 0; } @@ -455,10 +469,12 @@ static int vhost_user_get_u64(struct vhost_dev *dev= , int request, uint64_t *u64) return 0; } =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 if (vhost_user_read(dev, &msg) < 0) { - return 0; + return -1; } =20 if (msg.request !=3D request) { @@ -489,7 +505,9 @@ static int vhost_user_set_owner(struct vhost_dev *dev= ) .flags =3D VHOST_USER_VERSION, }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 return 0; } @@ -501,7 +519,9 @@ static int vhost_user_reset_device(struct vhost_dev *= dev) .flags =3D VHOST_USER_VERSION, }; =20 - vhost_user_write(dev, &msg, NULL, 0); + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { + return -1; + } =20 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_ad= dr) { VhostUserMsg msg =3D { 0 }; - int err; =20 assert(dev->vhost_ops->backend_type =3D=3D VHOST_BACKEND_TYPE_USER); =20 @@ -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 =3D sizeof(msg.payload.u64); =20 - err =3D vhost_user_write(dev, &msg, NULL, 0); - return err; + return vhost_user_write(dev, &msg, NULL, 0); } return -1; } --=20 MST