From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: Jens Freimann <jfreimann@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>
Subject: [PULL for-4.2 2/3] net/virtio: Fix failover error handling crash bugs
Date: Mon, 2 Dec 2019 16:27:45 +0100 [thread overview]
Message-ID: <20191202152746.32292-3-armbru@redhat.com> (raw)
In-Reply-To: <20191202152746.32292-1-armbru@redhat.com>
Functions that take an Error ** parameter to pass an error to the
caller expect the parameter to point to null.
failover_replug_primary() violates this precondition in several
places:
* After qemu_opts_from_qdict() failed, *errp is no longer null.
Passing it to error_setg() is wrong, and will trip the assertion in
error_setv(). Messed up in commit 150ab54aa6 "net/virtio: fix
re-plugging of primary device". Simply drop the error_setg().
* Passing @errp to qemu_opt_set_bool(), hotplug_handler_pre_plug(),
and hotplug_handler_plug() is wrong. If one of the first two fails,
*errp is no longer null. Risks tripping the same assertion.
Moreover, continuing after such errors is unsafe. Messed up in
commit 9711cd0dfc "net/virtio: add failover support". Fix by
handling each error properly.
failover_replug_primary() crashes when passed a null @errp. Also
messed up in commit 9711cd0dfc. This bug can't bite as no caller
actually passes null. Fix it anyway.
Fixes: 9711cd0dfc3fa414f7f64935713c07134ae67971
Fixes: 150ab54aa6934583180f88a2bd540bc6fc4fbff3
Cc: Jens Freimann <jfreimann@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20191130194240.10517-3-armbru@redhat.com>
Reviewed-by: Jens Freimann <jfreimann@redhat.com>
---
hw/net/virtio-net.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 87088ba374..db3d7c38e6 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2795,6 +2795,7 @@ static bool failover_unplug_primary(VirtIONet *n)
static bool failover_replug_primary(VirtIONet *n, Error **errp)
{
+ Error *err = NULL;
HotplugHandler *hotplug_ctrl;
PCIDevice *pdev = PCI_DEVICE(n->primary_dev);
@@ -2806,27 +2807,33 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
qemu_find_opts("device"),
n->primary_device_dict, errp);
if (!n->primary_device_opts) {
- error_setg(errp, "virtio_net: couldn't find primary device opts");
- goto out;
+ return false;
}
}
n->primary_bus = n->primary_dev->parent_bus;
if (!n->primary_bus) {
error_setg(errp, "virtio_net: couldn't find primary bus");
- goto out;
+ return false;
}
qdev_set_parent_bus(n->primary_dev, n->primary_bus);
n->primary_should_be_hidden = false;
qemu_opt_set_bool(n->primary_device_opts,
- "partially_hotplugged", true, errp);
+ "partially_hotplugged", true, &err);
+ if (err) {
+ goto out;
+ }
hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev);
if (hotplug_ctrl) {
- hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, errp);
+ hotplug_handler_pre_plug(hotplug_ctrl, n->primary_dev, &err);
+ if (err) {
+ goto out;
+ }
hotplug_handler_plug(hotplug_ctrl, n->primary_dev, errp);
}
out:
- return *errp == NULL;
+ error_propagate(errp, err);
+ return !err;
}
static void virtio_net_handle_migration_primary(VirtIONet *n,
--
2.21.0
next prev parent reply other threads:[~2019-12-02 15:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-02 15:27 [PULL for-4.2 0/3] Error reporting patches for 2019-12-02 Markus Armbruster
2019-12-02 15:27 ` [PULL for-4.2 1/3] net/virtio: Drop useless n->primary_dev not null checks Markus Armbruster
2019-12-02 15:27 ` Markus Armbruster [this message]
2019-12-02 15:27 ` [PULL for-4.2 3/3] block/file-posix: Fix laio_init() error handling crash bug Markus Armbruster
2019-12-02 17:09 ` [PULL for-4.2 0/3] Error reporting patches for 2019-12-02 Peter Maydell
2019-12-02 18:22 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191202152746.32292-3-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=jfreimann@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).