Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c8361aee7d | |||
| bda88aaa38 | |||
| ca4d795c85 | |||
| e2e196d813 | |||
| a5a2a38a5e | |||
| 30f098460c | |||
| 7017c99a1e | |||
| 1c41ce6f30 | |||
| c6db79d97f | |||
| 7b7f8cc27f | |||
| a9cc41b082 | |||
| ce1593f88f |
@@ -1,31 +0,0 @@
|
||||
[suppress_function]
|
||||
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||
soname_regexp = libvirt\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||
soname_regexp = libvirt-admin\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||
soname_regexp = libvirt\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||
soname_regexp = libvirt-admin\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_storage_.*\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_storage_.*\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_driver_.*\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_driver_.*\\.so.*
|
||||
@@ -0,0 +1,8 @@
|
||||
.build*.log
|
||||
*.rpm
|
||||
i686
|
||||
x86_64
|
||||
libvirt-*.tar.gz
|
||||
libvirt-0.6.0.tar.gz
|
||||
libvirt-0.6.1.tar.gz
|
||||
libvirt-0.6.2.tar.gz
|
||||
@@ -1,5 +0,0 @@
|
||||
.build*.log
|
||||
*.rpm
|
||||
i686
|
||||
x86_64
|
||||
libvirt-*.tar.xz
|
||||
@@ -1,56 +0,0 @@
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Thu, 21 Jan 2021 16:01:06 -0500
|
||||
Subject: [PATCH] build: support explicitly disabling netcf
|
||||
|
||||
placing "-Dnetcf=disabled" on the meson commandline was ignored,
|
||||
meaning that even with that option the build would get WITH_NETCF if
|
||||
the netcf-devel package was found - the only way to disable it was to
|
||||
uninstall netcf-devel.
|
||||
|
||||
This patch adds the small bit of logic to check the netcf meson
|
||||
commandline option (in addition to whether netcf-devel is installed)
|
||||
before defining WITH_NETCF.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 06169a115d46d8870a96d293c2faf6ea87e71020)
|
||||
---
|
||||
meson.build | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index b5164f68ed..e9d6d9f82e 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -1155,8 +1155,10 @@ libm_dep = cc.find_library('m', required : false)
|
||||
|
||||
netcf_version = '0.1.8'
|
||||
netcf_dep = dependency('netcf', version: '>=' + netcf_version, required: get_option('netcf'))
|
||||
-if netcf_dep.found()
|
||||
- conf.set('WITH_NETCF', 1)
|
||||
+if not get_option('netcf').disabled()
|
||||
+ if netcf_dep.found()
|
||||
+ conf.set('WITH_NETCF', 1)
|
||||
+ endif
|
||||
endif
|
||||
|
||||
have_gnu_gettext_tools = false
|
||||
@@ -1550,7 +1552,7 @@ elif get_option('driver_hyperv').enabled()
|
||||
error('openwsman is required for the Hyper-V driver')
|
||||
endif
|
||||
|
||||
-if not get_option('driver_interface').disabled() and conf.has('WITH_LIBVIRTD') and (udev_dep.found() or netcf_dep.found())
|
||||
+if not get_option('driver_interface').disabled() and conf.has('WITH_LIBVIRTD') and (udev_dep.found() or conf.has('WITH_NETCF'))
|
||||
conf.set('WITH_INTERFACE', 1)
|
||||
elif get_option('driver_interface').enabled()
|
||||
error('Requested the Interface driver without netcf or udev and libvirtd support')
|
||||
@@ -2362,7 +2364,7 @@ libs_summary = {
|
||||
'libssh': libssh_dep.found(),
|
||||
'libssh2': libssh2_dep.found(),
|
||||
'libutil': libutil_dep.found(),
|
||||
- 'netcf': netcf_dep.found(),
|
||||
+ 'netcf': conf.has('WITH_NETCF'),
|
||||
'NLS': have_gnu_gettext_tools,
|
||||
'numactl': numactl_dep.found(),
|
||||
'openwsman': openwsman_dep.found(),
|
||||
@@ -1,72 +0,0 @@
|
||||
From: wangjian <wangjian161@huawei.com>
|
||||
Date: Fri, 26 Mar 2021 11:21:16 +0800
|
||||
Subject: [PATCH] node_device_udev: Serialize access to pci_get_strings)_
|
||||
|
||||
Since the functions provided by libpciaccess are not thread-safe,
|
||||
when the udev-event and nodedev-init threads of libvirt call the
|
||||
pci_get_strings function provided by libpaciaccess at the same
|
||||
time the following can happen:
|
||||
|
||||
nodedev-init thread:
|
||||
nodeStateInitializeEnumerate ->
|
||||
udevEnumerateDevices->
|
||||
udevProcessDeviceListEntry ->
|
||||
udevAddOneDevice ->
|
||||
udevGetDeviceDetails->
|
||||
udevProcessPCI ->
|
||||
udevTranslatePCIIds ->
|
||||
pci_get_strings -> (libpciaccess)
|
||||
find_device_name ->
|
||||
populate_vendor ->
|
||||
d = realloc( vend->devices, (vend->num_devices + 1), * sizeof( struct pci_device_leaf ) );
|
||||
vend->num_devices++;
|
||||
|
||||
udev-event thread:
|
||||
udevEventHandleThread ->
|
||||
udevHandleOneDevice ->
|
||||
udevAddOneDevice->
|
||||
udevGetDeviceDetails->
|
||||
udevProcessPCI ->
|
||||
udevTranslatePCIIds ->
|
||||
pci_get_strings -> (libpciaccess)
|
||||
find_device_name ->
|
||||
populate_vendor ->
|
||||
d = realloc( vend->devices, (vend->num_devices + 1), * sizeof( struct pci_device_leaf ) );
|
||||
vend->num_devices++;
|
||||
|
||||
Signed-off-by: WangJian <wangjian161@huawei.com>
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 59788a5caea5f292c86e07a31ee2b853d68db87e)
|
||||
---
|
||||
src/node_device/node_device_udev.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
|
||||
index 55a2731681..6f0defe908 100644
|
||||
--- a/src/node_device/node_device_udev.c
|
||||
+++ b/src/node_device/node_device_udev.c
|
||||
@@ -328,6 +328,7 @@ udevGenerateDeviceName(struct udev_device *device,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static virMutex pciaccessMutex = VIR_MUTEX_INITIALIZER;
|
||||
|
||||
static int
|
||||
udevTranslatePCIIds(unsigned int vendor,
|
||||
@@ -346,12 +347,14 @@ udevTranslatePCIIds(unsigned int vendor,
|
||||
m.device_class_mask = 0;
|
||||
m.match_data = 0;
|
||||
|
||||
- /* pci_get_strings returns void */
|
||||
+ /* pci_get_strings returns void and unfortunately is not thread safe. */
|
||||
+ virMutexLock(&pciaccessMutex);
|
||||
pci_get_strings(&m,
|
||||
&device_name,
|
||||
&vendor_name,
|
||||
NULL,
|
||||
NULL);
|
||||
+ virMutexUnlock(&pciaccessMutex);
|
||||
|
||||
*vendor_string = g_strdup(vendor_name);
|
||||
*product_string = g_strdup(device_name);
|
||||
@@ -1,53 +0,0 @@
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Thu, 24 Jun 2021 16:58:09 +0200
|
||||
Subject: [PATCH] virSetUIDGIDWithCaps: Don't drop CAP_SETPCAP right away
|
||||
|
||||
There are few cases where we execute a virCommand with all caps
|
||||
cleared (virCommandClearCaps()). For instance
|
||||
dnsmasqCapsRefreshInternal() does just that. This means, that
|
||||
after fork() and before exec() the virSetUIDGIDWithCaps() is
|
||||
called. But since the caller did not want to change anything,
|
||||
just drop capabilities, these are the values of arguments:
|
||||
|
||||
virSetUIDGIDWithCaps (uid=-1, gid=-1, groups=0x0, ngroups=0,
|
||||
capBits=0, clearExistingCaps=true)
|
||||
|
||||
This means that indeed all capabilities will be dropped,
|
||||
including CAP_SETPCAP. But this capability controls whether
|
||||
capabilities can be set, IOW whether capng_apply() succeeds.
|
||||
|
||||
There are two calls of capng_apply() in the function. The
|
||||
CAP_SETPCAP is dropped after the first call and thus the other
|
||||
call (capng_apply(CAPNG_SELECT_BOUNDS);) fails.
|
||||
|
||||
The solution is to keep the capability for as long as needed
|
||||
(just like CAP_SETGID and CAP_SETUID) and drop it only at the
|
||||
very end (just like CAP_SETGID and CAP_SETUID).
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1949388
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 438b50dda8a863fdc988e9ab612f097cc1626e8a)
|
||||
---
|
||||
src/util/virutil.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/util/virutil.c b/src/util/virutil.c
|
||||
index a0cd0f1bcd..7ae23a7061 100644
|
||||
--- a/src/util/virutil.c
|
||||
+++ b/src/util/virutil.c
|
||||
@@ -1202,12 +1202,10 @@ virSetUIDGIDWithCaps(uid_t uid, gid_t gid, gid_t *groups, int ngroups,
|
||||
}
|
||||
# ifdef PR_CAPBSET_DROP
|
||||
/* If newer kernel, we need also need setpcap to change the bounding set */
|
||||
- if ((capBits || need_setgid || need_setuid) &&
|
||||
- !capng_have_capability(CAPNG_EFFECTIVE, CAP_SETPCAP)) {
|
||||
+ if (!capng_have_capability(CAPNG_EFFECTIVE, CAP_SETPCAP)) {
|
||||
need_setpcap = true;
|
||||
- }
|
||||
- if (need_setpcap)
|
||||
capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED, CAP_SETPCAP);
|
||||
+ }
|
||||
# endif
|
||||
|
||||
/* Tell system we want to keep caps across uid change */
|
||||
@@ -1,51 +0,0 @@
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 28 Jun 2021 13:09:04 +0100
|
||||
Subject: [PATCH] security: fix SELinux label generation logic
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A process can access a file if the set of MCS categories
|
||||
for the file is equal-to *or* a subset-of, the set of
|
||||
MCS categories for the process.
|
||||
|
||||
If there are two VMs:
|
||||
|
||||
a) svirt_t:s0:c117
|
||||
b) svirt_t:s0:c117,c720
|
||||
|
||||
Then VM (b) is able to access files labelled for VM (a).
|
||||
|
||||
IOW, we must discard case where the categories are equal
|
||||
because that is a subset of many other valid category pairs.
|
||||
|
||||
Fixes: https://gitlab.com/libvirt/libvirt/-/issues/153
|
||||
CVE-2021-3631
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 15073504dbb624d3f6c911e85557019d3620fdb2)
|
||||
---
|
||||
src/security/security_selinux.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
|
||||
index 2fc6ef2616..61a871ec3d 100644
|
||||
--- a/src/security/security_selinux.c
|
||||
+++ b/src/security/security_selinux.c
|
||||
@@ -389,7 +389,15 @@ virSecuritySELinuxMCSFind(virSecurityManagerPtr mgr,
|
||||
VIR_DEBUG("Try cat %s:c%d,c%d", sens, c1 + catMin, c2 + catMin);
|
||||
|
||||
if (c1 == c2) {
|
||||
- mcs = g_strdup_printf("%s:c%d", sens, catMin + c1);
|
||||
+ /*
|
||||
+ * A process can access a file if the set of MCS categories
|
||||
+ * for the file is equal-to *or* a subset-of, the set of
|
||||
+ * MCS categories for the process.
|
||||
+ *
|
||||
+ * IOW, we must discard case where the categories are equal
|
||||
+ * because that is a subset of other category pairs.
|
||||
+ */
|
||||
+ continue;
|
||||
} else {
|
||||
if (c1 > c2) {
|
||||
int t = c1;
|
||||
@@ -1,43 +0,0 @@
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Thu, 22 Jul 2021 14:26:00 +0200
|
||||
Subject: [PATCH] virSetUIDGIDWithCaps: Set bounding capabilities only with
|
||||
CAP_SETPCAP
|
||||
|
||||
In one of my previous patches I've tried to postpone dropping
|
||||
CAP_SETPCAP until the very end because it's needed for
|
||||
capng_apply(). What I did not realize back then was that we might
|
||||
not have the capability to begin with. Because of unknown reasons
|
||||
capng_apply() pollutes logs only for CAPNG_SELECT_BOUNDS and not
|
||||
for CAPNG_SELECT_CAPS.
|
||||
|
||||
Reproducer is really simple: run libvirtd as a regular user.
|
||||
During its initialization, libvirtd will spawn some binaries
|
||||
(dnsmasq, qemu-*, etc.) and while doing so it will try to drop
|
||||
capabilities.
|
||||
|
||||
Anyway, let's call capng_apply(CAPNG_SELECT_BOUNDS) only if we
|
||||
have the CAP_SETPCAP (which is tracked in need_setpcap variable).
|
||||
|
||||
Fixes: 438b50dda8a863fdc988e9ab612f097cc1626e8a
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1924218
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Cole Robinson <crobinso@redhat.com>
|
||||
(cherry picked from commit a2476f37a7789eb9315b77bb451f4754ef4ef15b)
|
||||
---
|
||||
src/util/virutil.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/util/virutil.c b/src/util/virutil.c
|
||||
index 7ae23a7061..333f99e91d 100644
|
||||
--- a/src/util/virutil.c
|
||||
+++ b/src/util/virutil.c
|
||||
@@ -1269,7 +1269,8 @@ virSetUIDGIDWithCaps(uid_t uid, gid_t gid, gid_t *groups, int ngroups,
|
||||
* do this if we failed to get the capability above, so ignore the
|
||||
* return value.
|
||||
*/
|
||||
- capng_apply(CAPNG_SELECT_BOUNDS);
|
||||
+ if (!need_setpcap)
|
||||
+ capng_apply(CAPNG_SELECT_BOUNDS);
|
||||
|
||||
/* Drop the caps that allow setuid/gid (unless they were requested) */
|
||||
if (need_setgid)
|
||||
@@ -1,57 +0,0 @@
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Mon, 10 May 2021 15:07:09 +0200
|
||||
Subject: [PATCH] qemu_firmware: don't error out for unknown firmware features
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When QEMU introduces new firmware features libvirt will fail until we
|
||||
list that feature in our code as well which doesn't sound right.
|
||||
|
||||
We should simply ignore the new feature until we add a proper support
|
||||
for it.
|
||||
|
||||
Reported-by: Laszlo Ersek <lersek@redhat.com>
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 61d95a1073833ec4323c1ef28e71e913c55aa7b9)
|
||||
---
|
||||
src/qemu/qemu_firmware.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
|
||||
index 639cff7459..e602de22e3 100644
|
||||
--- a/src/qemu/qemu_firmware.c
|
||||
+++ b/src/qemu/qemu_firmware.c
|
||||
@@ -573,6 +573,7 @@ qemuFirmwareFeatureParse(const char *path,
|
||||
virJSONValuePtr featuresJSON;
|
||||
g_autoptr(qemuFirmwareFeature) features = NULL;
|
||||
size_t nfeatures;
|
||||
+ size_t nparsed = 0;
|
||||
size_t i;
|
||||
|
||||
if (!(featuresJSON = virJSONValueObjectGetArray(doc, "features"))) {
|
||||
@@ -592,17 +593,16 @@ qemuFirmwareFeatureParse(const char *path,
|
||||
int tmp;
|
||||
|
||||
if ((tmp = qemuFirmwareFeatureTypeFromString(tmpStr)) <= 0) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("unknown feature %s"),
|
||||
- tmpStr);
|
||||
- return -1;
|
||||
+ VIR_DEBUG("ignoring unknown QEMU firmware feature '%s'", tmpStr);
|
||||
+ continue;
|
||||
}
|
||||
|
||||
- features[i] = tmp;
|
||||
+ features[nparsed] = tmp;
|
||||
+ nparsed++;
|
||||
}
|
||||
|
||||
fw->features = g_steal_pointer(&features);
|
||||
- fw->nfeatures = nfeatures;
|
||||
+ fw->nfeatures = nparsed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Wed, 21 Jul 2021 11:22:25 +0200
|
||||
Subject: [PATCH] storage_driver: Unlock object on ACL fail in
|
||||
storagePoolLookupByTargetPath
|
||||
|
||||
'virStoragePoolObjListSearch' returns a locked and refed object, thus we
|
||||
must release it on ACL permission failure.
|
||||
|
||||
Fixes: 7aa0e8c0cb8
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1984318
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 447f69dec47e1b0bd15ecd7cd49a9fd3b050fb87)
|
||||
---
|
||||
src/storage/storage_driver.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
|
||||
index 16bc53aa46..2787c1671b 100644
|
||||
--- a/src/storage/storage_driver.c
|
||||
+++ b/src/storage/storage_driver.c
|
||||
@@ -1739,8 +1739,10 @@ storagePoolLookupByTargetPath(virConnectPtr conn,
|
||||
storagePoolLookupByTargetPathCallback,
|
||||
cleanpath))) {
|
||||
def = virStoragePoolObjGetDef(obj);
|
||||
- if (virStoragePoolLookupByTargetPathEnsureACL(conn, def) < 0)
|
||||
+ if (virStoragePoolLookupByTargetPathEnsureACL(conn, def) < 0) {
|
||||
+ virStoragePoolObjEndAPI(&obj);
|
||||
return NULL;
|
||||
+ }
|
||||
|
||||
pool = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL);
|
||||
virStoragePoolObjEndAPI(&obj);
|
||||
@@ -1,81 +0,0 @@
|
||||
From 7e299ba649b1288d529c7595c0e6060c9ae0ff2a Mon Sep 17 00:00:00 2001
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Mon, 29 Nov 2021 09:57:49 +0100
|
||||
Subject: [PATCH 1/2] wireshark: Switch to tvb_bytes_to_str()
|
||||
|
||||
When the dissector sees a byte sequence that is either an opaque
|
||||
data (xdr_opaque) or a byte sequence (xdr_bytes) it formats the
|
||||
bytes as a hex numbers using our own implementation. But
|
||||
wireshark already provides a function for it: tvb_bytes_to_str().
|
||||
NB, the reason why it returns a const string is so that callers
|
||||
don't try to free it - the string is allocated using an allocator
|
||||
which will decide when to free it.
|
||||
|
||||
The wireshark formatter was introduced in wireshark commit of
|
||||
v1.99.2~479 and thus is present in the version we require at
|
||||
least (2.6.0).
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
tools/wireshark/src/packet-libvirt.c | 30 ++++++++--------------------
|
||||
1 file changed, 8 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
index f43919b05d..cb922b8070 100644
|
||||
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
@@ -158,24 +158,6 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
}
|
||||
}
|
||||
|
||||
-static const gchar *
|
||||
-format_xdr_bytes(guint8 *bytes, guint32 length)
|
||||
-{
|
||||
- gchar *buf;
|
||||
- guint32 i;
|
||||
-
|
||||
- if (length == 0)
|
||||
- return "";
|
||||
- buf = wmem_alloc(wmem_packet_scope(), length*2 + 1);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- /* We know that buf has enough size to contain
|
||||
- 2 * length + '\0' characters. */
|
||||
- g_snprintf(buf, 2*(length - i) + 1, "%02x", bytes[i]);
|
||||
- buf += 2;
|
||||
- }
|
||||
- return buf - length*2;
|
||||
-}
|
||||
-
|
||||
static gboolean
|
||||
dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
guint32 size)
|
||||
@@ -187,8 +169,10 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
val = g_malloc(size);
|
||||
start = xdr_getpos(xdrs);
|
||||
if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) {
|
||||
- proto_tree_add_bytes_format_value(tree, hf, tvb, start, xdr_getpos(xdrs) - start,
|
||||
- NULL, "%s", format_xdr_bytes(val, size));
|
||||
+ gint len = xdr_getpos(xdrs) - start;
|
||||
+ const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
+
|
||||
+ proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s);
|
||||
} else {
|
||||
proto_tree_add_item(tree, hf_libvirt_unknown, tvb, start, -1, ENC_NA);
|
||||
}
|
||||
@@ -207,8 +191,10 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
|
||||
start = xdr_getpos(xdrs);
|
||||
if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) {
|
||||
- proto_tree_add_bytes_format_value(tree, hf, tvb, start, xdr_getpos(xdrs) - start,
|
||||
- NULL, "%s", format_xdr_bytes(val, length));
|
||||
+ gint len = xdr_getpos(xdrs) - start;
|
||||
+ const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
+
|
||||
+ proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s);
|
||||
/* Seems I can't call xdr_free() for this case.
|
||||
It will raises SEGV by referencing out of bounds call stack */
|
||||
free(val);
|
||||
--
|
||||
2.33.1
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
From 010613cfd8dae6d85602a84c5c95b2d441e1b3d1 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Mon, 29 Nov 2021 10:20:05 +0100
|
||||
Subject: [PATCH 2/2] wireshark: Drop needless comment in dissect_xdr_bytes()
|
||||
|
||||
In the dissect_xdr_bytes() there's a comment that the string
|
||||
allocated by xdr_bytes() can't be freed using xdr_free(). Well,
|
||||
that is expected because xdr_bytes() used plain calloc() AND the
|
||||
string is not an XDR struct but plain 'char *' type. Passing it
|
||||
to xdr_free() must result in weird things happening.
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
tools/wireshark/src/packet-libvirt.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c
|
||||
index cb922b8070..eeacbcdf0e 100644
|
||||
--- a/tools/wireshark/src/packet-libvirt.c
|
||||
+++ b/tools/wireshark/src/packet-libvirt.c
|
||||
@@ -195,8 +195,6 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf,
|
||||
const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len);
|
||||
|
||||
proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s);
|
||||
- /* Seems I can't call xdr_free() for this case.
|
||||
- It will raises SEGV by referencing out of bounds call stack */
|
||||
free(val);
|
||||
return TRUE;
|
||||
} else {
|
||||
--
|
||||
2.33.1
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# Makefile for source rpm: libvirt
|
||||
# $Id$
|
||||
NAME := libvirt
|
||||
SPECFILE = $(firstword $(wildcard *.spec))
|
||||
|
||||
define find-makefile-common
|
||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(find-makefile-common))
|
||||
|
||||
ifeq ($(MAKEFILE_COMMON),)
|
||||
# attempt a checkout
|
||||
define checkout-makefile-common
|
||||
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
|
||||
endif
|
||||
|
||||
include $(MAKEFILE_COMMON)
|
||||
@@ -0,0 +1,27 @@
|
||||
From 934b71abf1b908f720811a44ad5411cfc1a4ca37 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Thu, 28 May 2009 13:15:57 +0000
|
||||
Subject: [PATCH 1/1] Avoid broken networking with new QEMU/KVM >= 86
|
||||
|
||||
---
|
||||
src/qemu_conf.c | 4 ++--
|
||||
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index 93dc0b7..a04d216 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -658,8 +658,8 @@ qemudNetworkIfaceConnect(virConnectPtr conn,
|
||||
}
|
||||
|
||||
snprintf(tapfdstr, sizeof(tapfdstr),
|
||||
- "tap,fd=%d,script=,vlan=%d,ifname=%s",
|
||||
- tapfd, vlan, net->ifname);
|
||||
+ "tap,fd=%d,vlan=%d",
|
||||
+ tapfd, vlan);
|
||||
|
||||
if (!(retval = strdup(tapfdstr)))
|
||||
goto no_memory;
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
From 4db7474b0c1907e877d7206edeb4d73962971096 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
Date: Tue, 12 May 2009 15:31:22 +0000
|
||||
Subject: [PATCH 1/1] * src/network_driver.c: enable bridges which are not up
|
||||
without an IP address, patch by Ludwig Nussel
|
||||
Daniel
|
||||
|
||||
---
|
||||
src/network_driver.c | 9 +++------
|
||||
1 files changed, 3 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/network_driver.c b/src/network_driver.c
|
||||
index a17a769..a163b15 100644
|
||||
--- a/src/network_driver.c
|
||||
+++ b/src/network_driver.c
|
||||
@@ -836,8 +836,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn,
|
||||
goto err_delbr;
|
||||
}
|
||||
|
||||
- if (network->def->ipAddress &&
|
||||
- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) {
|
||||
+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) {
|
||||
virReportSystemError(conn, err,
|
||||
_("failed to bring the bridge '%s' up"),
|
||||
network->def->bridge);
|
||||
@@ -878,8 +877,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn,
|
||||
networkRemoveIptablesRules(driver, network);
|
||||
|
||||
err_delbr1:
|
||||
- if (network->def->ipAddress &&
|
||||
- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
|
||||
+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
|
||||
char ebuf[1024];
|
||||
networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"),
|
||||
network->def->bridge, virStrerror(err, ebuf, sizeof ebuf));
|
||||
@@ -920,8 +918,7 @@ static int networkShutdownNetworkDaemon(virConnectPtr conn,
|
||||
networkRemoveIptablesRules(driver, network);
|
||||
|
||||
char ebuf[1024];
|
||||
- if (network->def->ipAddress &&
|
||||
- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
|
||||
+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
|
||||
networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"),
|
||||
network->def->bridge, virStrerror(err, ebuf, sizeof ebuf));
|
||||
}
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
From fbd16cecc72494e8a9450f38197221f2f50c9d0e Mon Sep 17 00:00:00 2001
|
||||
From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
|
||||
Date: Thu, 16 Apr 2009 15:56:27 +0000
|
||||
Subject: [PATCH 1/1] Don't log monitor output to domain log file.
|
||||
|
||||
It's logged via the logging system already. Prefix monitor debug output with vm
|
||||
name.
|
||||
---
|
||||
src/qemu_driver.c | 60 +++++++++++++++++++++-------------------------------
|
||||
1 files changed, 24 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 79ee072..f5b5fa5 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1710,27 +1710,11 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
-
|
||||
- /* Log, but ignore failures to write logfile for VM */
|
||||
- if (safewrite(vm->logfile, buf, strlen(buf)) < 0) {
|
||||
- char ebuf[1024];
|
||||
- VIR_WARN(_("Unable to log VM console data: %s\n"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- }
|
||||
-
|
||||
*reply = buf;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
- if (buf) {
|
||||
- /* Log, but ignore failures to write logfile for VM */
|
||||
- if (safewrite(vm->logfile, buf, strlen(buf)) < 0) {
|
||||
- char ebuf[1024];
|
||||
- VIR_WARN(_("Unable to log VM console data: %s\n"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- }
|
||||
- VIR_FREE(buf);
|
||||
- }
|
||||
+ VIR_FREE(buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2463,7 +2447,7 @@ static int qemudDomainGetMemoryBalloon(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("balloon reply: '%s'", reply);
|
||||
+ DEBUG ("%s: balloon reply: '%s'", vm->def->name, reply);
|
||||
if ((offset = strstr(reply, BALLOON_PREFIX)) != NULL) {
|
||||
unsigned int memMB;
|
||||
char *end;
|
||||
@@ -2517,7 +2501,7 @@ static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
|
||||
|
||||
/* If the command failed qemu prints: 'unknown command'
|
||||
* No message is printed on success it seems */
|
||||
- DEBUG ("balloon reply: %s", reply);
|
||||
+ DEBUG ("%s: balloon reply: %s",vm->def->name, reply);
|
||||
if (strstr(reply, "\nunknown command:")) {
|
||||
/* Don't set error - it is expected memory balloon fails on many qemu */
|
||||
ret = 0;
|
||||
@@ -2812,7 +2796,7 @@ static int qemudDomainSave(virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("migrate reply: %s", info);
|
||||
+ DEBUG ("%s: migrate reply: %s", vm->def->name, info);
|
||||
|
||||
/* If the command isn't supported then qemu prints:
|
||||
* unknown command: migrate" */
|
||||
@@ -3658,7 +3642,7 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
|
||||
/* If the command failed qemu prints:
|
||||
* device not found, device is locked ...
|
||||
* No message is printed on success it seems */
|
||||
- DEBUG ("ejectable media change reply: %s", reply);
|
||||
+ DEBUG ("%s: ejectable media change reply: %s", vm->def->name, reply);
|
||||
if (strstr(reply, "\ndevice ")) {
|
||||
qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
_("changing cdrom media failed: %s"), reply);
|
||||
@@ -3719,7 +3703,7 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("pci_add reply: %s", reply);
|
||||
+ DEBUG ("%s: pci_add reply: %s", vm->def->name, reply);
|
||||
/* If the command succeeds qemu prints:
|
||||
* OK bus 0... */
|
||||
#define PCI_ATTACH_OK_MSG "OK bus 0, slot "
|
||||
@@ -3787,7 +3771,7 @@ static int qemudDomainAttachUsbMassstorageDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("attach_usb reply: %s", reply);
|
||||
+ DEBUG ("%s: attach_usb reply: %s",vm->def->name, reply);
|
||||
/* If the command failed qemu prints:
|
||||
* Could not add ... */
|
||||
if (strstr(reply, "Could not add ")) {
|
||||
@@ -3841,7 +3825,7 @@ static int qemudDomainAttachHostDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("attach_usb reply: %s", reply);
|
||||
+ DEBUG ("%s: attach_usb reply: %s", vm->def->name, reply);
|
||||
/* If the command failed qemu prints:
|
||||
* Could not add ... */
|
||||
if (strstr(reply, "Could not add ")) {
|
||||
@@ -3980,7 +3964,7 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("pci_del reply: %s", reply);
|
||||
+ DEBUG ("%s: pci_del reply: %s",vm->def->name, reply);
|
||||
/* If the command fails due to a wrong slot qemu prints: invalid slot,
|
||||
* nothing is printed on success */
|
||||
if (strstr(reply, "invalid slot")) {
|
||||
@@ -4210,7 +4194,7 @@ qemudDomainBlockStats (virDomainPtr dom,
|
||||
"%s", _("'info blockstats' command failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
- DEBUG ("info blockstats reply: %s", info);
|
||||
+ DEBUG ("%s: info blockstats reply: %s", vm->def->name, info);
|
||||
|
||||
/* If the command isn't supported then qemu prints the supported
|
||||
* info commands, so the output starts "info ". Since this is
|
||||
@@ -4251,21 +4235,25 @@ qemudDomainBlockStats (virDomainPtr dom,
|
||||
if (STRPREFIX (p, "rd_bytes=")) {
|
||||
p += 9;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->rd_bytes) == -1)
|
||||
- DEBUG ("error reading rd_bytes: %s", p);
|
||||
+ DEBUG ("%s: error reading rd_bytes: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "wr_bytes=")) {
|
||||
p += 9;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->wr_bytes) == -1)
|
||||
- DEBUG ("error reading wr_bytes: %s", p);
|
||||
+ DEBUG ("%s: error reading wr_bytes: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "rd_operations=")) {
|
||||
p += 14;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->rd_req) == -1)
|
||||
- DEBUG ("error reading rd_req: %s", p);
|
||||
+ DEBUG ("%s: error reading rd_req: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "wr_operations=")) {
|
||||
p += 14;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->wr_req) == -1)
|
||||
- DEBUG ("error reading wr_req: %s", p);
|
||||
+ DEBUG ("%s: error reading wr_req: %s",
|
||||
+ vm->def->name, p);
|
||||
} else
|
||||
- DEBUG ("unknown block stat near %s", p);
|
||||
+ DEBUG ("%s: unknown block stat near %s", vm->def->name, p);
|
||||
|
||||
/* Skip to next label. */
|
||||
p = strchr (p, ' ');
|
||||
@@ -4477,7 +4465,7 @@ qemudDomainMemoryPeek (virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("memsave reply: %s", info);
|
||||
+ DEBUG ("%s: memsave reply: %s", vm->def->name, info);
|
||||
|
||||
/* Read the memory file into buffer. */
|
||||
if (saferead (fd, buffer, size) == (ssize_t) -1) {
|
||||
@@ -4794,7 +4782,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
"%s", _("off-line migration specified, but suspend operation failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
- DEBUG ("stop reply: %s", info);
|
||||
+ DEBUG ("%s: stop reply: %s", vm->def->name, info);
|
||||
VIR_FREE(info);
|
||||
paused = 1;
|
||||
|
||||
@@ -4811,7 +4799,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
snprintf (cmd, sizeof cmd, "migrate_set_speed %lum", resource);
|
||||
qemudMonitorCommand (vm, cmd, &info);
|
||||
|
||||
- DEBUG ("migrate_set_speed reply: %s", info);
|
||||
+ DEBUG ("%s: migrate_set_speed reply: %s", vm->def->name, info);
|
||||
VIR_FREE (info);
|
||||
}
|
||||
|
||||
@@ -4830,7 +4818,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("migrate reply: %s", info);
|
||||
+ DEBUG ("%s: migrate reply: %s", vm->def->name, info);
|
||||
|
||||
/* Now check for "fail" in the output string */
|
||||
if (strstr(info, "fail") != NULL) {
|
||||
@@ -4869,7 +4857,7 @@ cleanup:
|
||||
vm->def->name);
|
||||
}
|
||||
else {
|
||||
- DEBUG ("cont reply: %s", info);
|
||||
+ DEBUG ("%s: cont reply: %s", vm->def->name, info);
|
||||
VIR_FREE(info);
|
||||
}
|
||||
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||
To: libvir-list@redhat.com
|
||||
Date: Thu, 30 Apr 2009 15:09:05 +0100
|
||||
Subject: [libvirt] PATCH: Enable migration with QEMU >= 0.10.0
|
||||
|
||||
The KVM migration code was added to QEMU for the 0.10.0 release, so we
|
||||
should enable this in libvirt now.
|
||||
|
||||
Daniel
|
||||
|
||||
diff -r be7993675e07 src/qemu_conf.c
|
||||
--- a/src/qemu_conf.c Thu Apr 30 14:49:27 2009 +0100
|
||||
+++ b/src/qemu_conf.c Thu Apr 30 15:08:45 2009 +0100
|
||||
@@ -472,16 +472,13 @@ int qemudExtractVersionInfo(const char *
|
||||
|
||||
/*
|
||||
* Handling of -incoming arg with varying features
|
||||
- * -incoming tcp (kvm >= 79)
|
||||
- * -incoming exec (kvm >= 80)
|
||||
+ * -incoming tcp (kvm >= 79, qemu >= 0.10.0)
|
||||
+ * -incoming exec (kvm >= 80, qemu >= 0.10.0)
|
||||
* -incoming stdio (all earlier kvm)
|
||||
*
|
||||
* NB, there was a pre-kvm-79 'tcp' support, but it
|
||||
* was broken, because it blocked the monitor console
|
||||
* while waiting for data, so pretend it doesn't exist
|
||||
- *
|
||||
- * XXX when next QEMU release after 0.9.1 arrives,
|
||||
- * we'll need to add MIGRATE_QEMU_TCP/EXEC here too
|
||||
*/
|
||||
if (kvm_version >= 79) {
|
||||
flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
|
||||
@@ -489,6 +486,9 @@ int qemudExtractVersionInfo(const char *
|
||||
flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
|
||||
} else if (kvm_version > 0) {
|
||||
flags |= QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO;
|
||||
+ } else if (version >= 10000) {
|
||||
+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
|
||||
+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
|
||||
}
|
||||
|
||||
if (retversion)
|
||||
|
||||
|
||||
--
|
||||
@@ -0,0 +1,144 @@
|
||||
From e7be6cc841a5652b73ddd2ccd3769c7f8bbad13d Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Tue, 12 May 2009 16:41:49 +0000
|
||||
Subject: [PATCH 1/2] Fix interrupting of main event thread & protect against accidental uniniitalized variables
|
||||
|
||||
---
|
||||
qemud/event.c | 42 +++++++++++++++++++++++++++++++++++-------
|
||||
1 files changed, 35 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/qemud/event.c b/qemud/event.c
|
||||
index 65f548e..754f2b1 100644
|
||||
--- a/qemud/event.c
|
||||
+++ b/qemud/event.c
|
||||
@@ -84,10 +84,10 @@ struct virEventLoop {
|
||||
static struct virEventLoop eventLoop;
|
||||
|
||||
/* Unique ID for the next FD watch to be registered */
|
||||
-static int nextWatch = 0;
|
||||
+static int nextWatch = 1;
|
||||
|
||||
/* Unique ID for the next timer to be registered */
|
||||
-static int nextTimer = 0;
|
||||
+static int nextTimer = 1;
|
||||
|
||||
static void virEventLock(void)
|
||||
{
|
||||
@@ -143,15 +143,22 @@ int virEventAddHandleImpl(int fd, int events,
|
||||
|
||||
void virEventUpdateHandleImpl(int watch, int events) {
|
||||
int i;
|
||||
+ EVENT_DEBUG("Update handle w=%d e=%d", watch, events);
|
||||
+
|
||||
+ if (watch <= 0) {
|
||||
+ VIR_WARN("Ignoring invalid update watch %d", watch);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
virEventLock();
|
||||
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||
if (eventLoop.handles[i].watch == watch) {
|
||||
eventLoop.handles[i].events =
|
||||
virEventHandleTypeToPollEvent(events);
|
||||
+ virEventInterruptLocked();
|
||||
break;
|
||||
}
|
||||
}
|
||||
- virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
}
|
||||
|
||||
@@ -164,6 +171,12 @@ void virEventUpdateHandleImpl(int watch, int events) {
|
||||
int virEventRemoveHandleImpl(int watch) {
|
||||
int i;
|
||||
EVENT_DEBUG("Remove handle %d", watch);
|
||||
+
|
||||
+ if (watch <= 0) {
|
||||
+ VIR_WARN("Ignoring invalid remove watch %d", watch);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
virEventLock();
|
||||
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||
if (eventLoop.handles[i].deleted)
|
||||
@@ -172,11 +185,11 @@ int virEventRemoveHandleImpl(int watch) {
|
||||
if (eventLoop.handles[i].watch == watch) {
|
||||
EVENT_DEBUG("mark delete %d %d", i, eventLoop.handles[i].fd);
|
||||
eventLoop.handles[i].deleted = 1;
|
||||
+ virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
- virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
return -1;
|
||||
}
|
||||
@@ -232,6 +245,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
||||
struct timeval tv;
|
||||
int i;
|
||||
EVENT_DEBUG("Updating timer %d timeout with %d ms freq", timer, frequency);
|
||||
+
|
||||
+ if (timer <= 0) {
|
||||
+ VIR_WARN("Ignoring invalid update timer %d", timer);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (gettimeofday(&tv, NULL) < 0) {
|
||||
return;
|
||||
}
|
||||
@@ -244,10 +263,10 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
||||
frequency >= 0 ? frequency +
|
||||
(((unsigned long long)tv.tv_sec)*1000) +
|
||||
(((unsigned long long)tv.tv_usec)/1000) : 0;
|
||||
+ virEventInterruptLocked();
|
||||
break;
|
||||
}
|
||||
}
|
||||
- virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
}
|
||||
|
||||
@@ -260,6 +279,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
||||
int virEventRemoveTimeoutImpl(int timer) {
|
||||
int i;
|
||||
EVENT_DEBUG("Remove timer %d", timer);
|
||||
+
|
||||
+ if (timer <= 0) {
|
||||
+ VIR_WARN("Ignoring invalid remove timer %d", timer);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
virEventLock();
|
||||
for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
|
||||
if (eventLoop.timeouts[i].deleted)
|
||||
@@ -267,11 +292,11 @@ int virEventRemoveTimeoutImpl(int timer) {
|
||||
|
||||
if (eventLoop.timeouts[i].timer == timer) {
|
||||
eventLoop.timeouts[i].deleted = 1;
|
||||
+ virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
- virEventInterruptLocked();
|
||||
virEventUnlock();
|
||||
return -1;
|
||||
}
|
||||
@@ -617,9 +642,12 @@ static int virEventInterruptLocked(void)
|
||||
char c = '\0';
|
||||
|
||||
if (!eventLoop.running ||
|
||||
- pthread_self() == eventLoop.leader)
|
||||
+ pthread_self() == eventLoop.leader) {
|
||||
+ VIR_DEBUG("Skip interrupt, %d %d", eventLoop.running, (int)eventLoop.leader);
|
||||
return 0;
|
||||
+ }
|
||||
|
||||
+ VIR_DEBUG0("Interrupting");
|
||||
if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c))
|
||||
return -1;
|
||||
return 0;
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
From 6483ee77ed12f037d68a6adc690624fa1b508dc0 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Tue, 12 May 2009 16:43:04 +0000
|
||||
Subject: [PATCH 2/2] Fix watch/timer event deletion
|
||||
|
||||
---
|
||||
qemud/event.c | 112 ++++++++++++++++++++++++++-------------------------------
|
||||
1 files changed, 51 insertions(+), 61 deletions(-)
|
||||
|
||||
diff --git a/qemud/event.c b/qemud/event.c
|
||||
index 754f2b1..a57d967 100644
|
||||
--- a/qemud/event.c
|
||||
+++ b/qemud/event.c
|
||||
@@ -313,7 +313,7 @@ static int virEventCalculateTimeout(int *timeout) {
|
||||
EVENT_DEBUG("Calculate expiry of %d timers", eventLoop.timeoutsCount);
|
||||
/* Figure out if we need a timeout */
|
||||
for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
|
||||
- if (eventLoop.timeouts[i].deleted || eventLoop.timeouts[i].frequency < 0)
|
||||
+ if (eventLoop.timeouts[i].frequency < 0)
|
||||
continue;
|
||||
|
||||
EVENT_DEBUG("Got a timeout scheduled for %llu", eventLoop.timeouts[i].expiresAt);
|
||||
@@ -350,32 +350,26 @@ static int virEventCalculateTimeout(int *timeout) {
|
||||
* file handles. The caller must free the returned data struct
|
||||
* returns: the pollfd array, or NULL on error
|
||||
*/
|
||||
-static int virEventMakePollFDs(struct pollfd **retfds) {
|
||||
+static struct pollfd *virEventMakePollFDs(void) {
|
||||
struct pollfd *fds;
|
||||
- int i, nfds = 0;
|
||||
+ int i;
|
||||
|
||||
- for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||
- if (eventLoop.handles[i].deleted)
|
||||
- continue;
|
||||
- nfds++;
|
||||
- }
|
||||
- *retfds = NULL;
|
||||
/* Setup the poll file handle data structs */
|
||||
- if (VIR_ALLOC_N(fds, nfds) < 0)
|
||||
- return -1;
|
||||
+ if (VIR_ALLOC_N(fds, eventLoop.handlesCount) < 0)
|
||||
+ return NULL;
|
||||
|
||||
- for (i = 0, nfds = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||
- if (eventLoop.handles[i].deleted)
|
||||
- continue;
|
||||
- fds[nfds].fd = eventLoop.handles[i].fd;
|
||||
- fds[nfds].events = eventLoop.handles[i].events;
|
||||
- fds[nfds].revents = 0;
|
||||
+ for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||
+ EVENT_DEBUG("Prepare n=%d w=%d, f=%d e=%d", i,
|
||||
+ eventLoop.handles[i].watch,
|
||||
+ eventLoop.handles[i].fd,
|
||||
+ eventLoop.handles[i].events);
|
||||
+ fds[i].fd = eventLoop.handles[i].fd;
|
||||
+ fds[i].events = eventLoop.handles[i].events;
|
||||
+ fds[i].revents = 0;
|
||||
//EVENT_DEBUG("Wait for %d %d", eventLoop.handles[i].fd, eventLoop.handles[i].events);
|
||||
- nfds++;
|
||||
}
|
||||
|
||||
- *retfds = fds;
|
||||
- return nfds;
|
||||
+ return fds;
|
||||
}
|
||||
|
||||
|
||||
@@ -435,26 +429,30 @@ static int virEventDispatchTimeouts(void) {
|
||||
* Returns 0 upon success, -1 if an error occurred
|
||||
*/
|
||||
static int virEventDispatchHandles(int nfds, struct pollfd *fds) {
|
||||
- int i, n;
|
||||
+ int i;
|
||||
|
||||
- for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) {
|
||||
+ /* NB, use nfds not eventLoop.handlesCount, because new
|
||||
+ * fds might be added on end of list, and they're not
|
||||
+ * in the fds array we've got */
|
||||
+ for (i = 0 ; i < nfds ; i++) {
|
||||
if (eventLoop.handles[i].deleted) {
|
||||
- EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd);
|
||||
+ EVENT_DEBUG("Skip deleted n=%d w=%d f=%d", i,
|
||||
+ eventLoop.handles[i].watch, eventLoop.handles[i].fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
- if (fds[n].revents) {
|
||||
+ if (fds[i].revents) {
|
||||
virEventHandleCallback cb = eventLoop.handles[i].cb;
|
||||
void *opaque = eventLoop.handles[i].opaque;
|
||||
- int hEvents = virPollEventToEventHandleType(fds[n].revents);
|
||||
- EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd,
|
||||
- fds[n].revents, eventLoop.handles[i].opaque);
|
||||
+ int hEvents = virPollEventToEventHandleType(fds[i].revents);
|
||||
+ EVENT_DEBUG("Dispatch n=%d f=%d w=%d e=%d %p", i,
|
||||
+ fds[i].fd, eventLoop.handles[i].watch,
|
||||
+ fds[i].revents, eventLoop.handles[i].opaque);
|
||||
virEventUnlock();
|
||||
(cb)(eventLoop.handles[i].watch,
|
||||
- fds[n].fd, hEvents, opaque);
|
||||
+ fds[i].fd, hEvents, opaque);
|
||||
virEventLock();
|
||||
}
|
||||
- n++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -545,22 +543,21 @@ static int virEventCleanupHandles(void) {
|
||||
* at least one file handle has an event, or a timer expires
|
||||
*/
|
||||
int virEventRunOnce(void) {
|
||||
- struct pollfd *fds;
|
||||
+ struct pollfd *fds = NULL;
|
||||
int ret, timeout, nfds;
|
||||
|
||||
virEventLock();
|
||||
eventLoop.running = 1;
|
||||
eventLoop.leader = pthread_self();
|
||||
- if ((nfds = virEventMakePollFDs(&fds)) < 0) {
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
|
||||
- if (virEventCalculateTimeout(&timeout) < 0) {
|
||||
- VIR_FREE(fds);
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
+ if (virEventCleanupTimeouts() < 0 ||
|
||||
+ virEventCleanupHandles() < 0)
|
||||
+ goto error;
|
||||
+
|
||||
+ if (!(fds = virEventMakePollFDs()) ||
|
||||
+ virEventCalculateTimeout(&timeout) < 0)
|
||||
+ goto error;
|
||||
+ nfds = eventLoop.handlesCount;
|
||||
|
||||
virEventUnlock();
|
||||
|
||||
@@ -572,38 +569,31 @@ int virEventRunOnce(void) {
|
||||
if (errno == EINTR) {
|
||||
goto retry;
|
||||
}
|
||||
- VIR_FREE(fds);
|
||||
- return -1;
|
||||
+ goto error_unlocked;
|
||||
}
|
||||
|
||||
virEventLock();
|
||||
- if (virEventDispatchTimeouts() < 0) {
|
||||
- VIR_FREE(fds);
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
+ if (virEventDispatchTimeouts() < 0)
|
||||
+ goto error;
|
||||
|
||||
if (ret > 0 &&
|
||||
- virEventDispatchHandles(nfds, fds) < 0) {
|
||||
- VIR_FREE(fds);
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
- VIR_FREE(fds);
|
||||
-
|
||||
- if (virEventCleanupTimeouts() < 0) {
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
+ virEventDispatchHandles(nfds, fds) < 0)
|
||||
+ goto error;
|
||||
|
||||
- if (virEventCleanupHandles() < 0) {
|
||||
- virEventUnlock();
|
||||
- return -1;
|
||||
- }
|
||||
+ if (virEventCleanupTimeouts() < 0 ||
|
||||
+ virEventCleanupHandles() < 0)
|
||||
+ goto error;
|
||||
|
||||
eventLoop.running = 0;
|
||||
virEventUnlock();
|
||||
+ VIR_FREE(fds);
|
||||
return 0;
|
||||
+
|
||||
+error:
|
||||
+ virEventUnlock();
|
||||
+error_unlocked:
|
||||
+ VIR_FREE(fds);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
static void virEventHandleWakeup(int watch ATTRIBUTE_UNUSED,
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
diff -rup libvirt-0.6.2/src/security_selinux.c new/src/security_selinux.c
|
||||
--- libvirt-0.6.2/src/security_selinux.c 2009-05-10 22:04:25.000000000 -0400
|
||||
+++ new/src/security_selinux.c 2009-05-10 22:06:09.000000000 -0400
|
||||
@@ -338,6 +338,9 @@ SELinuxSetSecurityImageLabel(virConnectP
|
||||
{
|
||||
const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
|
||||
|
||||
+ if (!disk->src)
|
||||
+ return 0;
|
||||
+
|
||||
if (disk->shared) {
|
||||
return SELinuxSetFilecon(conn, disk->src, default_image_context);
|
||||
} else if (disk->readonly) {
|
||||
@@ -0,0 +1,82 @@
|
||||
From 2b3fcdc378e7bec5c1a78b81632756e92930fd24 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon, 11 May 2009 15:14:24 +0000
|
||||
Subject: [PATCH 1/1] Fix QEMU ARGV detection with kvm >= 85
|
||||
|
||||
---
|
||||
src/qemu_conf.c | 18 ++++++++++++++----
|
||||
src/qemu_driver.c | 12 ++----------
|
||||
2 files changed, 16 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index 9cb71eb..a57d3ab 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -431,18 +431,28 @@ int qemudExtractVersionInfo(const char *qemu,
|
||||
return -1;
|
||||
|
||||
char *help = NULL;
|
||||
- enum { MAX_HELP_OUTPUT_SIZE = 8192 };
|
||||
+ enum { MAX_HELP_OUTPUT_SIZE = 1024*64 };
|
||||
int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help);
|
||||
- if (len < 0)
|
||||
+ if (len < 0) {
|
||||
+ virReportSystemError(NULL, errno, "%s",
|
||||
+ _("Unable to read QEMU help output"));
|
||||
goto cleanup2;
|
||||
+ }
|
||||
|
||||
if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
|
||||
&major, &minor, µ, &kvm_version) != 4)
|
||||
kvm_version = 0;
|
||||
|
||||
- if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u",
|
||||
- &major, &minor, µ) != 3)
|
||||
+ if (!kvm_version &&
|
||||
+ sscanf(help, "QEMU PC emulator version %u.%u.%u",
|
||||
+ &major, &minor, µ) != 3) {
|
||||
+ char *eol = strchr(help, '\n');
|
||||
+ if (eol) *eol = '\0';
|
||||
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
+ _("cannot parse QEMU version number in '%s'"),
|
||||
+ help);
|
||||
goto cleanup2;
|
||||
+ }
|
||||
|
||||
version = (major * 1000 * 1000) + (minor * 1000) + micro;
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 30642d5..bd60b29 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1391,12 +1391,8 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
||||
|
||||
if (qemudExtractVersionInfo(emulator,
|
||||
NULL,
|
||||
- &qemuCmdFlags) < 0) {
|
||||
- qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
- _("Cannot determine QEMU argv syntax %s"),
|
||||
- emulator);
|
||||
+ &qemuCmdFlags) < 0)
|
||||
goto cleanup;
|
||||
- }
|
||||
|
||||
if (qemuPrepareHostDevices(conn, vm->def) < 0)
|
||||
goto cleanup;
|
||||
@@ -3715,12 +3711,8 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
|
||||
|
||||
if (qemudExtractVersionInfo(vm->def->emulator,
|
||||
NULL,
|
||||
- &qemuCmdFlags) < 0) {
|
||||
- qemudReportError(conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
- _("Cannot determine QEMU argv syntax %s"),
|
||||
- vm->def->emulator);
|
||||
+ &qemuCmdFlags) < 0)
|
||||
return -1;
|
||||
- }
|
||||
|
||||
if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) {
|
||||
if (!(devname = qemudDiskDeviceName(conn, newdisk)))
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
From c3b3f6005d45552d01823504925eb587889cf25a Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Fri, 29 May 2009 14:34:35 +0000
|
||||
Subject: [PATCH 1/1] Avoid double-free in daemon client cleanup code
|
||||
|
||||
---
|
||||
qemud/qemud.c | 22 +++++++++++++++++-----
|
||||
1 files changed, 17 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/qemud/qemud.c b/qemud/qemud.c
|
||||
index 1375560..783dc69 100644
|
||||
--- a/qemud/qemud.c
|
||||
+++ b/qemud/qemud.c
|
||||
@@ -1397,7 +1397,10 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
|
||||
* jobs have finished, then clean it up elsehwere
|
||||
*/
|
||||
void qemudDispatchClientFailure(struct qemud_client *client) {
|
||||
- virEventRemoveHandleImpl(client->watch);
|
||||
+ if (client->watch != -1) {
|
||||
+ virEventRemoveHandleImpl(client->watch);
|
||||
+ client->watch = -1;
|
||||
+ }
|
||||
|
||||
/* Deregister event delivery callback */
|
||||
if(client->conn) {
|
||||
@@ -1406,12 +1406,21 @@ void qemudDispatchClientFailure(struct qemud_client *client) {
|
||||
}
|
||||
|
||||
#if HAVE_SASL
|
||||
- if (client->saslconn) sasl_dispose(&client->saslconn);
|
||||
+ if (client->saslconn) {
|
||||
+ sasl_dispose(&client->saslconn);
|
||||
+ client->saslconn = NULL;
|
||||
+ }
|
||||
free(client->saslUsername);
|
||||
+ client->saslUsername = NULL;
|
||||
#endif
|
||||
- if (client->tlssession) gnutls_deinit (client->tlssession);
|
||||
- close(client->fd);
|
||||
- client->fd = -1;
|
||||
+ if (client->tlssession) {
|
||||
+ gnutls_deinit (client->tlssession);
|
||||
+ client->tlssession = NULL;
|
||||
+ }
|
||||
+ if (client->fd != -1) {
|
||||
+ close(client->fd);
|
||||
+ client->fd = -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
From 0ae4c67ff5f1d24698c5cfc8a9719d333c892644 Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Thu, 16 Apr 2009 11:23:55 +0100
|
||||
Subject: [PATCH 1/3] qemu -drive takes format= not fmt=
|
||||
|
||||
Seems like a simple typo - it has been "format=" since the flag
|
||||
was introduced, but we added it as "fmt=".
|
||||
|
||||
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
||||
---
|
||||
src/qemu_conf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index f36c927..6f9e610 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -1135,7 +1135,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
|
||||
virBufferAddLit(&opt, ",boot=on");
|
||||
if (disk->driverType)
|
||||
- virBufferVSprintf(&opt, ",fmt=%s", disk->driverType);
|
||||
+ virBufferVSprintf(&opt, ",format=%s", disk->driverType);
|
||||
|
||||
if (disk->cachemode) {
|
||||
const char *mode =
|
||||
@@ -0,0 +1,57 @@
|
||||
From daf3db93457427c25325781af684758c0341a6aa Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
Date: Fri, 29 May 2009 13:32:06 +0000
|
||||
Subject: [PATCH 1/1] PPC Qemu Machine Type update
|
||||
* src/qemu_conf.c docs/schemas/domain.rng
|
||||
tests/capabilityschemadata/caps-qemu-kvm.xml: PPC Qemu Machine Type
|
||||
changed from g3bw to g3beige some time ago, patch by Thomas Baker
|
||||
Daniel
|
||||
|
||||
---
|
||||
docs/schemas/domain.rng | 2 +-
|
||||
src/qemu_conf.c | 2 +-
|
||||
tests/capabilityschemadata/caps-qemu-kvm.xml | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
|
||||
index 204c633..11cf04a 100644
|
||||
--- a/docs/schemas/domain.rng
|
||||
+++ b/docs/schemas/domain.rng
|
||||
@@ -184,7 +184,7 @@
|
||||
</attribute>
|
||||
<attribute name="machine">
|
||||
<choice>
|
||||
- <value>g3bw</value>
|
||||
+ <value>g3beige</value>
|
||||
<value>mac99</value>
|
||||
<value>prep</value>
|
||||
</choice>
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index 18156cd..d54f2ca 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -192,7 +192,7 @@ static const char *const arch_info_hvm_sparc_machines[] = {
|
||||
"sun4m"
|
||||
};
|
||||
static const char *const arch_info_hvm_ppc_machines[] = {
|
||||
- "g3bw", "mac99", "prep"
|
||||
+ "g3beige", "mac99", "prep"
|
||||
};
|
||||
|
||||
static const char *const arch_info_xen_x86_machines[] = {
|
||||
diff --git a/tests/capabilityschemadata/caps-qemu-kvm.xml b/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
index fd8523e..893f9ed 100644
|
||||
--- a/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
+++ b/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
@@ -81,7 +81,7 @@
|
||||
<arch name='ppc'>
|
||||
<wordsize>32</wordsize>
|
||||
<emulator>/usr/bin/qemu-system-ppc</emulator>
|
||||
- <machine>g3bw</machine>
|
||||
+ <machine>g3beige</machine>
|
||||
<machine>mac99</machine>
|
||||
<machine>prep</machine>
|
||||
<domain type='qemu'>
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
diff -rup libvirt-0.6.2/src/security_selinux.c libvirt-0.6.2.new/src/security_selinux.c
|
||||
--- libvirt-0.6.2/src/security_selinux.c 2009-04-03 15:36:56.000000000 +0100
|
||||
+++ libvirt-0.6.2.new/src/security_selinux.c 2009-05-05 13:39:42.000000000 +0100
|
||||
@@ -24,11 +24,12 @@
|
||||
#include "virterror_internal.h"
|
||||
#include "util.h"
|
||||
#include "memory.h"
|
||||
-
|
||||
+#include "logging.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
||||
|
||||
static char default_domain_context[1024];
|
||||
+static char default_content_context[1024];
|
||||
static char default_image_context[1024];
|
||||
#define SECURITY_SELINUX_VOID_DOI "0"
|
||||
#define SECURITY_SELINUX_NAME "selinux"
|
||||
@@ -148,8 +149,13 @@ SELinuxInitialize(virConnectPtr conn)
|
||||
close(fd);
|
||||
|
||||
ptr = strchrnul(default_image_context, '\n');
|
||||
- *ptr = '\0';
|
||||
-
|
||||
+ if (*ptr == '\n') {
|
||||
+ *ptr = '\0';
|
||||
+ strcpy(default_content_context, ptr+1);
|
||||
+ ptr = strchrnul(default_content_context, '\n');
|
||||
+ if (*ptr == '\n')
|
||||
+ *ptr = '\0';
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -275,6 +281,8 @@ SELinuxSetFilecon(virConnectPtr conn, co
|
||||
{
|
||||
char ebuf[1024];
|
||||
|
||||
+ VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon);
|
||||
+
|
||||
if(setfilecon(path, tcon) < 0) {
|
||||
virSecurityReportError(conn, VIR_ERR_ERROR,
|
||||
_("%s: unable to set security context "
|
||||
@@ -299,6 +307,8 @@ SELinuxRestoreSecurityImageLabel(virConn
|
||||
char *newpath = NULL;
|
||||
const char *path = disk->src;
|
||||
|
||||
+ /* Don't restore labels on readoly/shared disks, because
|
||||
+ * other VMs may still be accessing these */
|
||||
if (disk->readonly || disk->shared)
|
||||
return 0;
|
||||
|
||||
@@ -328,8 +338,13 @@ SELinuxSetSecurityImageLabel(virConnectP
|
||||
{
|
||||
const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
|
||||
|
||||
- if (secdef->imagelabel)
|
||||
+ if (disk->shared) {
|
||||
+ return SELinuxSetFilecon(conn, disk->src, default_image_context);
|
||||
+ } else if (disk->readonly) {
|
||||
+ return SELinuxSetFilecon(conn, disk->src, default_content_context);
|
||||
+ } else if (secdef->imagelabel) {
|
||||
return SELinuxSetFilecon(conn, disk->src, secdef->imagelabel);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -403,9 +418,6 @@ SELinuxSetSecurityLabel(virConnectPtr co
|
||||
|
||||
if (secdef->imagelabel) {
|
||||
for (i = 0 ; i < vm->def->ndisks ; i++) {
|
||||
- if (vm->def->disks[i]->readonly ||
|
||||
- vm->def->disks[i]->shared) continue;
|
||||
-
|
||||
if (SELinuxSetSecurityImageLabel(conn, vm, vm->def->disks[i]) < 0)
|
||||
return -1;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
--- src/qemu_conf.c.orig 2009-04-02 11:50:10.000000000 +0200
|
||||
+++ src/qemu_conf.c 2009-04-03 17:46:59.000000000 +0200
|
||||
@@ -779,6 +779,20 @@ int qemudBuildCommandLine(virConnectPtr
|
||||
char domid[50];
|
||||
char *pidfile;
|
||||
const char *cpu = NULL;
|
||||
+ int skipSound = 0;
|
||||
+
|
||||
+ if (driver->securityDriver &&
|
||||
+ driver->securityDriver->name &&
|
||||
+ STREQ(driver->securityDriver->name, "selinux") &&
|
||||
+ getuid() == 0) {
|
||||
+ static int soundWarned = 0;
|
||||
+ skipSound = 1;
|
||||
+ if (vm->def->nsounds &&
|
||||
+ !soundWarned) {
|
||||
+ soundWarned = 1;
|
||||
+ VIR_WARN0("Sound cards for VMs are disabled while SELinux security model is active");
|
||||
+ }
|
||||
+ }
|
||||
|
||||
uname_normalize(&ut);
|
||||
|
||||
@@ -1425,7 +1439,8 @@ int qemudBuildCommandLine(virConnectPtr
|
||||
}
|
||||
|
||||
/* Add sound hardware */
|
||||
- if (vm->def->nsounds) {
|
||||
+ if (vm->def->nsounds &&
|
||||
+ !skipSound) {
|
||||
int size = 100;
|
||||
char *modstr;
|
||||
if (VIR_ALLOC_N(modstr, size+1) < 0)
|
||||
@@ -0,0 +1,47 @@
|
||||
From 7f7a4403860f56d5a1ad65bfd16f5bf97a971d45 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
Date: Wed, 13 May 2009 16:19:59 +0000
|
||||
Subject: [PATCH 1/1] * src/buf.c: avoid an XML attribute escaping bug #499791
|
||||
daniel
|
||||
|
||||
---
|
||||
src/buf.c | 16 +++++++++++++++-
|
||||
1 files changed, 15 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/buf.c b/src/buf.c
|
||||
index cdcdac9..259175d 100644
|
||||
--- a/src/buf.c
|
||||
+++ b/src/buf.c
|
||||
@@ -266,7 +266,7 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st
|
||||
return;
|
||||
|
||||
len = strlen(str);
|
||||
- if (VIR_ALLOC_N(escaped, 5 * len + 1) < 0) {
|
||||
+ if (VIR_ALLOC_N(escaped, 6 * len + 1) < 0) {
|
||||
virBufferNoMemory(buf);
|
||||
return;
|
||||
}
|
||||
@@ -290,6 +290,20 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st
|
||||
*out++ = 'm';
|
||||
*out++ = 'p';
|
||||
*out++ = ';';
|
||||
+ } else if (*cur == '"') {
|
||||
+ *out++ = '&';
|
||||
+ *out++ = 'q';
|
||||
+ *out++ = 'u';
|
||||
+ *out++ = 'o';
|
||||
+ *out++ = 't';
|
||||
+ *out++ = ';';
|
||||
+ } else if (*cur == '\'') {
|
||||
+ *out++ = '&';
|
||||
+ *out++ = 'a';
|
||||
+ *out++ = 'p';
|
||||
+ *out++ = 'o';
|
||||
+ *out++ = 's';
|
||||
+ *out++ = ';';
|
||||
} else if ((*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') ||
|
||||
(*cur == '\r')) {
|
||||
/*
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
From 3d7771e0570e09096ad9391a857dad48b150bc0c Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Wed, 6 May 2009 16:33:28 +0100
|
||||
Subject: [PATCH] Fix qemu driver's interpretation of <hostdev managed='yes'/>
|
||||
|
||||
This change:
|
||||
|
||||
Tue Mar 3 08:55:13 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
Don't try to detach & reset PCI devices while running test
|
||||
suite for XML-> ARGV conversion.
|
||||
* src/qemu_driver.c: Add qemuPrepareHostDevices() helper to
|
||||
detach and reset PCI devices.
|
||||
* src/qemu_conf.c: Don't detach & reset PCI devices while
|
||||
building the command line argv
|
||||
|
||||
accidentally did this:
|
||||
|
||||
- if (hostdev->managed) {
|
||||
+ if (!hostdev->managed) {
|
||||
|
||||
Which results in managed='yes' not causing the device to be
|
||||
detached when the guest is starting.
|
||||
|
||||
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
||||
---
|
||||
src/qemu_driver.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 5898026..59312c0 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1215,7 +1215,7 @@ static int qemuPrepareHostDevices(virConnectPtr conn,
|
||||
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||
continue;
|
||||
|
||||
- if (!hostdev->managed) {
|
||||
+ if (hostdev->managed) {
|
||||
pciDevice *dev = pciGetDevice(conn,
|
||||
hostdev->source.subsys.u.pci.domain,
|
||||
hostdev->source.subsys.u.pci.bus,
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
commit 0e51348cb9aeafe5e2fd6469a4bde0baa1eb8720
|
||||
Author: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Mon May 4 15:06:03 2009 -0400
|
||||
|
||||
Refresh QEMU driver capabilities for each getCapabilities call.
|
||||
|
||||
Also fix up a couple issues where caps are accessed without locking
|
||||
the driver structure.
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 23ea961..790dac6 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1885,10 +1885,12 @@ static int qemudGetNodeInfo(virConnectPtr conn,
|
||||
|
||||
static char *qemudGetCapabilities(virConnectPtr conn) {
|
||||
struct qemud_driver *driver = conn->privateData;
|
||||
- char *xml;
|
||||
+ char *xml = NULL;
|
||||
|
||||
qemuDriverLock(driver);
|
||||
- if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
|
||||
+ virCapabilitiesFree(qemu_driver->caps);
|
||||
+ if ((qemu_driver->caps = qemudCapsInit()) == NULL ||
|
||||
+ (xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
|
||||
virReportOOMError(conn);
|
||||
qemuDriverUnlock(driver);
|
||||
|
||||
@@ -3169,20 +3171,26 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel)
|
||||
+static int qemudNodeGetSecurityModel(virConnectPtr conn,
|
||||
+ virSecurityModelPtr secmodel)
|
||||
{
|
||||
struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
|
||||
char *p;
|
||||
+ int ret = 0;
|
||||
|
||||
- if (!driver->securityDriver)
|
||||
- return -2;
|
||||
+ qemuDriverLock(driver);
|
||||
+ if (!driver->securityDriver) {
|
||||
+ ret = -2;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
|
||||
p = driver->caps->host.secModel.model;
|
||||
if (strlen(p) >= VIR_SECURITY_MODEL_BUFLEN-1) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
_("security model string exceeds max %d bytes"),
|
||||
VIR_SECURITY_MODEL_BUFLEN-1);
|
||||
- return -1;
|
||||
+ ret = -1;
|
||||
+ goto cleanup;
|
||||
}
|
||||
strcpy(secmodel->model, p);
|
||||
|
||||
@@ -3191,10 +3199,14 @@ static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr sec
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
_("security DOI string exceeds max %d bytes"),
|
||||
VIR_SECURITY_DOI_BUFLEN-1);
|
||||
- return -1;
|
||||
+ ret = -1;
|
||||
+ goto cleanup;
|
||||
}
|
||||
strcpy(secmodel->doi, p);
|
||||
- return 0;
|
||||
+
|
||||
+cleanup:
|
||||
+ qemuDriverUnlock(driver);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/* TODO: check seclabel restore */
|
||||
+854
-1888
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user