[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 29/42] ivshmem: Rely on server sending the ID rig
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH v2 29/42] ivshmem: Rely on server sending the ID right after the version |
Date: |
Mon, 7 Mar 2016 20:25:41 +0100 |
The protocol specification (ivshmem-spec.txt, formerly
ivshmem_device_spec.txt) has always required the ID message to be sent
right at the beginning, and ivshmem-server has always complied. The
device, however, accepts it out of order. If an interrupt setup
arrived before it, though, it would be misinterpreted as connect
notification. Fix the latent bug by relying on the spec and
ivshmem-server's actual behavior.
Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
---
hw/misc/ivshmem.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index c3327dc..ca64654 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -653,8 +653,6 @@ static void process_msg(IVShmemState *s, int64_t msg, int
fd, Error **errp)
if (fd >= 0) {
process_msg_connect(s, msg, fd, errp);
- } else if (s->vm_id == -1) {
- s->vm_id = msg;
} else {
process_msg_disconnect(s, msg, errp);
}
@@ -722,6 +720,30 @@ static void ivshmem_recv_setup(IVShmemState *s, Error
**errp)
}
/*
+ * ivshmem-server sends the remaining initial messages in a fixed
+ * order, but the device has always accepted them in any order.
+ * Stay as compatible as practical, just in case people use
+ * servers that behave differently.
+ */
+
+ /*
+ * ivshmem_device_spec.txt has always required the ID message
+ * right here, and ivshmem-server has always complied. However,
+ * older versions of the device accepted it out of order, but
+ * broke when an interrupt setup message arrived before it.
+ */
+ msg = ivshmem_recv_msg(s, &fd, &err);
+ if (err) {
+ error_propagate(errp, err);
+ return;
+ }
+ if (fd != -1 || msg < 0 || msg > IVSHMEM_MAX_PEERS) {
+ error_setg(errp, "server sent invalid ID message");
+ return;
+ }
+ s->vm_id = msg;
+
+ /*
* Receive more messages until we got shared memory.
*/
do {
@@ -952,7 +974,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error
**errp)
/* we allocate enough space for 16 peers and grow as needed */
resize_peers(s, 16);
- s->vm_id = -1;
pci_register_bar(dev, 2, attr, &s->bar);
--
2.4.3
- [Qemu-devel] [PATCH v2 27/42] ivshmem: Receive shared memory synchronously in realize(), (continued)
- [Qemu-devel] [PATCH v2 27/42] ivshmem: Receive shared memory synchronously in realize(), Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 32/42] ivshmem: Tighten check of property "size", Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 26/42] ivshmem: Plug leaks on unplug, fix peer disconnect, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 37/42] ivshmem: Replace int role_val by OnOffAuto master, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 39/42] ivshmem: Clean up after the previous commit, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 31/42] ivshmem: Simplify how we cope with short reads from server, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 29/42] ivshmem: Rely on server sending the ID right after the version,
Markus Armbruster <=
- [Qemu-devel] [PATCH v2 38/42] ivshmem: Split ivshmem-plain, ivshmem-doorbell off ivshmem, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 30/42] ivshmem: Drop the hackish test for UNIX domain chardev, Markus Armbruster, 2016/03/07
- [Qemu-devel] [PATCH v2 17/42] ivshmem: Don't destroy the chardev on version mismatch, Markus Armbruster, 2016/03/07
- Re: [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split, Paolo Bonzini, 2016/03/08
- Re: [Qemu-devel] [PATCH v2 00/42] ivshmem: Fixes, cleanups, device model split, Paolo Bonzini, 2016/03/08