|
|
c401cc |
From d0b7495479db0593a8e3c944558fd8551f5f6e8c Mon Sep 17 00:00:00 2001
|
|
|
c401cc |
Message-Id: <d0b7495479db0593a8e3c944558fd8551f5f6e8c@dist-git>
|
|
|
c401cc |
From: Peter Krempa <pkrempa@redhat.com>
|
|
|
c401cc |
Date: Fri, 14 Mar 2014 17:50:53 +0100
|
|
|
c401cc |
Subject: [PATCH] qemu: monitor: Fix invalid parentheses
|
|
|
c401cc |
|
|
|
c401cc |
https://bugzilla.redhat.com/show_bug.cgi?id=1075973
|
|
|
c401cc |
|
|
|
c401cc |
RHEL-only: the code in question is handling a downstream command
|
|
|
c401cc |
|
|
|
c401cc |
A typo in parentheses in a condition checking the success of a monitor
|
|
|
c401cc |
command lead to a crash of libvirtd if the monitor command isn't
|
|
|
c401cc |
successful.
|
|
|
c401cc |
|
|
|
c401cc |
Bug introduced in 1.1.1-15.el7, with commit 673fabaf in response to BZ
|
|
|
c401cc |
1026966. Unfortunately it has been present since at least RHEL 6.3, BZ
|
|
|
c401cc |
573946.
|
|
|
c401cc |
|
|
|
c401cc |
The error path uses a combination of "ret == 0" and "ret < 0" error
|
|
|
c401cc |
checks. Due to this fact the disk definition parsed from the user input
|
|
|
c401cc |
is added to the domain definition but at the same time it's freed at the
|
|
|
c401cc |
end of the AttachDevice API.
|
|
|
c401cc |
|
|
|
c401cc |
When the domain is destroyed afterwards a use-after-free error leads to
|
|
|
c401cc |
a crash on random places when freeing the disk in question.
|
|
|
c401cc |
|
|
|
c401cc |
To reproduce use the attached reproducer with ANY disk definition
|
|
|
c401cc |
supported (gluster as stated in the original report isn't required).
|
|
|
c401cc |
|
|
|
c401cc |
Reproducer:
|
|
|
c401cc |
|
|
|
c401cc |
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
|
|
c401cc |
index 502b977..afcf603 100644
|
|
|
c401cc |
--- a/src/qemu/qemu_monitor.c
|
|
|
c401cc |
+++ b/src/qemu/qemu_monitor.c
|
|
|
c401cc |
@@ -28,6 +28,7 @@
|
|
|
c401cc |
#include <sys/un.h>
|
|
|
c401cc |
#include <unistd.h>
|
|
|
c401cc |
#include <fcntl.h>
|
|
|
c401cc |
+#include <signal.h>
|
|
|
c401cc |
|
|
|
c401cc |
#include "qemu_monitor.h"
|
|
|
c401cc |
#include "qemu_monitor_text.h"
|
|
|
c401cc |
@@ -3003,6 +3004,8 @@ int qemuMonitorAddDrive(qemuMonitorPtr mon,
|
|
|
c401cc |
return -1;
|
|
|
c401cc |
}
|
|
|
c401cc |
|
|
|
c401cc |
+ kill(mon->vm->pid, 9);
|
|
|
c401cc |
+
|
|
|
c401cc |
if (mon->json)
|
|
|
c401cc |
ret = qemuMonitorJSONAddDrive(mon, drivestr);
|
|
|
c401cc |
else
|
|
|
c401cc |
|
|
|
c401cc |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
c401cc |
---
|
|
|
c401cc |
src/qemu/qemu_monitor_json.c | 2 +-
|
|
|
c401cc |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
c401cc |
|
|
|
c401cc |
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
|
|
c401cc |
index 7b7992f..4f73813 100644
|
|
|
c401cc |
--- a/src/qemu/qemu_monitor_json.c
|
|
|
c401cc |
+++ b/src/qemu/qemu_monitor_json.c
|
|
|
c401cc |
@@ -3136,7 +3136,7 @@ int qemuMonitorJSONAddDrive(qemuMonitorPtr mon,
|
|
|
c401cc |
}
|
|
|
c401cc |
args = NULL; /* cmd owns reference to args now */
|
|
|
c401cc |
|
|
|
c401cc |
- if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply) < 0))
|
|
|
c401cc |
+ if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
|
|
|
c401cc |
goto cleanup;
|
|
|
c401cc |
|
|
|
c401cc |
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
|
|
|
c401cc |
--
|
|
|
c401cc |
1.9.0
|
|
|
c401cc |
|