Fix XML validation with qemu commandline passthrough (bz #1292131)

Fix crash in libvirt_leasehelper (bz #1202350)
Generate consistent systemtap tapsets regardless of host arch (bz #1173641)
Fix qemu:///session error 'Transport endpoint is not connected' (bz #1271183)
Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
This commit is contained in:
Cole Robinson 2016-01-20 20:04:34 -05:00
parent 43c932192d
commit c76aa1c80f
10 changed files with 377 additions and 2 deletions

View File

@ -0,0 +1,38 @@
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
Date: Thu, 17 Dec 2015 13:43:58 +0100
Subject: [PATCH] schema: interleave domain name and uuid with other elements
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Allow <name> and <uuid> anywhere under <domain>, not just at the top:
error:XML document failed to validate against schema: Unable to validate
doc against /usr/share/libvirt/schemas/domain.rng
Expecting an element name, got nothing
Invalid sequence in interleave
Element domain failed to validate content
Introduced with the first RelaxNG schema in commit c642103.
https://bugzilla.redhat.com/show_bug.cgi?id=1292131
(cherry picked from commit b4e0549febe416ffefc16f389423740d6d65fa74)
Signed-off-by: Ján Tomko <jtomko@redhat.com>
---
docs/schemas/domaincommon.rng | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index b252a17..48610ce 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -30,8 +30,8 @@
<define name="domain">
<element name="domain">
<ref name="hvs"/>
- <ref name="ids"/>
<interleave>
+ <ref name="ids"/>
<optional>
<ref name="title"/>
</optional>

View File

@ -0,0 +1,32 @@
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
Date: Thu, 14 Jan 2016 14:31:17 +0100
Subject: [PATCH] leaseshelper: fix crash when no mac is specified
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
If dnsmasq specified DNSMASQ_IAID (so we're dealing with an IPv6
lease) but no DNSMASQ_MAC, we skip creation of the new lease object.
Also skip adding it to the leases array.
https://bugzilla.redhat.com/show_bug.cgi?id=1202350
(cherry picked from commit df9fe124d650bc438c531673492569da87523d20)
Signed-off-by: Ján Tomko <jtomko@redhat.com>
---
src/network/leaseshelper.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c
index 2d528f7..6930310 100644
--- a/src/network/leaseshelper.c
+++ b/src/network/leaseshelper.c
@@ -439,7 +439,7 @@ main(int argc, char **argv)
case VIR_LEASE_ACTION_OLD:
case VIR_LEASE_ACTION_ADD:
- if (virJSONValueArrayAppend(leases_array_new, lease_new) < 0) {
+ if (lease_new && virJSONValueArrayAppend(leases_array_new, lease_new) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to create json"));
goto cleanup;

View File

@ -0,0 +1,63 @@
From: Cole Robinson <crobinso@redhat.com>
Date: Tue, 19 Jan 2016 22:19:56 -0500
Subject: [PATCH] build: predictably generate systemtap tapsets (bz 1173641)
The generated output is dependent on perl hashtable ordering, which
gives different results for i686 and x86_64. Fix this by sorting
the hash keys before iterating over them
https://bugzilla.redhat.com/show_bug.cgi?id=1173641
(cherry picked from commit a1edb05c6028470aa24b74aa0f8d5fb5a181128a)
---
src/rpc/gensystemtap.pl | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/rpc/gensystemtap.pl b/src/rpc/gensystemtap.pl
index 2467300..7b80fbf 100755
--- a/src/rpc/gensystemtap.pl
+++ b/src/rpc/gensystemtap.pl
@@ -72,7 +72,7 @@ function libvirt_rpc_auth_name(type, verbose)
{
EOF
my $first = 1;
-foreach my $type (keys %auth) {
+foreach my $type (sort(keys %auth)) {
my $cond = $first ? "if" : "} else if";
$first = 0;
print " $cond (type == ", $type, ") {\n";
@@ -95,7 +95,7 @@ function libvirt_rpc_type_name(type, verbose)
{
EOF
$first = 1;
-foreach my $type (keys %type) {
+foreach my $type (sort(keys %type)) {
my $cond = $first ? "if" : "} else if";
$first = 0;
print " $cond (type == ", $type, ") {\n";
@@ -118,7 +118,7 @@ function libvirt_rpc_status_name(status, verbose)
{
EOF
$first = 1;
-foreach my $status (keys %status) {
+foreach my $status (sort(keys %status)) {
my $cond = $first ? "if" : "} else if";
$first = 0;
print " $cond (status == ", $status, ") {\n";
@@ -141,7 +141,7 @@ function libvirt_rpc_program_name(program, verbose)
{
EOF
$first = 1;
-foreach my $prog (keys %funcs) {
+foreach my $prog (sort(keys %funcs)) {
my $cond = $first ? "if" : "} else if";
$first = 0;
print " $cond (program == ", $funcs{$prog}->{id}, ") {\n";
@@ -165,7 +165,7 @@ function libvirt_rpc_procedure_name(program, version, proc, verbose)
{
EOF
$first = 1;
-foreach my $prog (keys %funcs) {
+foreach my $prog (sort(keys %funcs)) {
my $cond = $first ? "if" : "} else if";
$first = 0;
print " $cond (program == ", $funcs{$prog}->{id}, " && version == ", $funcs{$prog}->{version}, ") {\n";

View File

@ -0,0 +1,30 @@
From: "Daniel P. Berrange" <berrange@redhat.com>
Date: Fri, 3 Jul 2015 16:51:56 +0100
Subject: [PATCH] rpc: ensure daemon is spawn even if dead socket exists
The auto-spawn code would originally attempt to spawn the
daemon for both ENOENT and ECONNREFUSED errors from connect().
The various refactorings eventually lost this so we only
spawn the daemon on ENOENT. The result is if the daemon exits
uncleanly, so that the socket is left in the filesystem, we
will never be able to auto-spawn the daemon again.
(cherry picked from commit 406ee8c226d2197ba1aaecb9cf3ad2b6df31ae44)
---
src/rpc/virnetsocket.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index 51f94d4..6153e0e 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -610,7 +610,8 @@ int virNetSocketNewConnectUNIX(const char *path,
while (retries &&
connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
- if (!(spawnDaemon && errno == ENOENT)) {
+ if (!(spawnDaemon && (errno == ENOENT ||
+ errno == ECONNREFUSED))) {
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
path);
goto cleanup;

View File

@ -0,0 +1,48 @@
From: Cole Robinson <crobinso@redhat.com>
Date: Mon, 11 Jan 2016 20:01:24 -0500
Subject: [PATCH] rpc: socket: Minor cleanups
- Add some debugging
- Make the loop dependent only on retries
- Make it explicit that connect(2) success exits the loop
- Invert the error checking logic
(cherry picked from commit f102c7146ed7f6e04af0ad3bce302476239f2502)
---
src/rpc/virnetsocket.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index 6153e0e..dcff69e 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -548,6 +548,9 @@ int virNetSocketNewConnectUNIX(const char *path,
char *rundir = NULL;
int ret = -1;
+ VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon,
+ NULLSTR(binary));
+
memset(&localAddr, 0, sizeof(localAddr));
memset(&remoteAddr, 0, sizeof(remoteAddr));
@@ -608,10 +611,15 @@ int virNetSocketNewConnectUNIX(const char *path,
if (remoteAddr.data.un.sun_path[0] == '@')
remoteAddr.data.un.sun_path[0] = '\0';
- while (retries &&
- connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
- if (!(spawnDaemon && (errno == ENOENT ||
- errno == ECONNREFUSED))) {
+ while (retries) {
+ if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) == 0) {
+ VIR_DEBUG("connect() succeeded");
+ break;
+ }
+ VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno);
+
+ if (!spawnDaemon ||
+ (errno != ENOENT && errno != ECONNREFUSED)) {
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
path);
goto cleanup;

View File

@ -0,0 +1,40 @@
From: Cole Robinson <crobinso@redhat.com>
Date: Mon, 11 Jan 2016 20:08:45 -0500
Subject: [PATCH] rpc: socket: Explicitly error if we exceed retry count
When we autolaunch libvirtd for session URIs, we spin in a retry
loop waiting for the daemon to start and the connect(2) to succeed.
However if we exceed the retry count, we don't explicitly raise an
error, which can yield a slew of different error messages elsewhere
in the code.
Explicitly raise the last connect(2) failure if we run out of retries.
(cherry picked from commit 8da02d528068942303923fc4f935e77cccac9c7c)
---
src/rpc/virnetsocket.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index dcff69e..90951be 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -618,7 +618,9 @@ int virNetSocketNewConnectUNIX(const char *path,
}
VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno);
+ retries--;
if (!spawnDaemon ||
+ retries == 0 ||
(errno != ENOENT && errno != ECONNREFUSED)) {
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
path);
@@ -628,7 +630,6 @@ int virNetSocketNewConnectUNIX(const char *path,
if (virNetSocketForkDaemon(binary) < 0)
goto cleanup;
- retries--;
usleep(5000);
}

View File

@ -0,0 +1,43 @@
From: Cole Robinson <crobinso@redhat.com>
Date: Mon, 11 Jan 2016 20:13:38 -0500
Subject: [PATCH] rpc: socket: Don't repeatedly attempt to launch daemon
On every socket connect(2) attempt we were re-launching session
libvirtd, up to 100 times in 5 seconds.
This understandably caused some weird load races and intermittent
qemu:///session startup failures
https://bugzilla.redhat.com/show_bug.cgi?id=1271183
(cherry picked from commit 2eb7a975756d05a5b54ab4acf60083beb6161ac6)
---
src/rpc/virnetsocket.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index 90951be..2ee4b6e 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -547,6 +547,7 @@ int virNetSocketNewConnectUNIX(const char *path,
virSocketAddr remoteAddr;
char *rundir = NULL;
int ret = -1;
+ bool daemonLaunched = false;
VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon,
NULLSTR(binary));
@@ -627,8 +628,12 @@ int virNetSocketNewConnectUNIX(const char *path,
goto cleanup;
}
- if (virNetSocketForkDaemon(binary) < 0)
- goto cleanup;
+ if (!daemonLaunched) {
+ if (virNetSocketForkDaemon(binary) < 0)
+ goto cleanup;
+
+ daemonLaunched = true;
+ }
usleep(5000);
}

View File

@ -0,0 +1,57 @@
From: Jiri Denemark <jdenemar@redhat.com>
Date: Fri, 15 Jan 2016 10:55:58 +0100
Subject: [PATCH] security: Do not restore kernel and initrd labels
Kernel/initrd files are essentially read-only shareable images and thus
should be handled in the same way. We already use the appropriate label
for kernel/initrd files when starting a domain, but when a domain gets
destroyed we would remove the labels which would make other running
domains using the same files very unhappy.
https://bugzilla.redhat.com/show_bug.cgi?id=921135
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
(cherry picked from commit 68acc701bd449481e3206723c25b18fcd3d261b7)
---
src/security/security_dac.c | 8 --------
src/security/security_selinux.c | 8 --------
2 files changed, 16 deletions(-)
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index deb6980..d01215f 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -971,14 +971,6 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
virSecurityDACRestoreSecurityFileLabel(def->os.loader->nvram) < 0)
rc = -1;
- if (def->os.kernel &&
- virSecurityDACRestoreSecurityFileLabel(def->os.kernel) < 0)
- rc = -1;
-
- if (def->os.initrd &&
- virSecurityDACRestoreSecurityFileLabel(def->os.initrd) < 0)
- rc = -1;
-
if (def->os.dtb &&
virSecurityDACRestoreSecurityFileLabel(def->os.dtb) < 0)
rc = -1;
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 6e67a86..2475a80 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1953,14 +1953,6 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.loader->nvram) < 0)
rc = -1;
- if (def->os.kernel &&
- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.kernel) < 0)
- rc = -1;
-
- if (def->os.initrd &&
- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.initrd) < 0)
- rc = -1;
-
if (def->os.dtb &&
virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.dtb) < 0)
rc = -1;

View File

@ -371,7 +371,7 @@
Summary: Library providing a simple virtualization API
Name: libvirt
Version: 1.2.13.2
Release: 1%{?dist}%{?extra_release}
Release: 2%{?dist}%{?extra_release}
License: LGPLv2+
Group: Development/Libraries
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
@ -382,8 +382,23 @@ URL: http://libvirt.org/
%endif
Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz
# Fix XML validation with qemu commandline passthrough (bz #1292131)
Patch0001: 0001-schema-interleave-domain-name-and-uuid-with-other-el.patch
# Fix crash in libvirt_leasehelper (bz #1202350)
Patch0002: 0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch
# Generate consistent systemtap tapsets regardless of host arch (bz
# #1173641)
Patch0003: 0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch
# Fix qemu:///session error 'Transport endpoint is not connected' (bz
# #1271183)
Patch0004: 0004-rpc-ensure-daemon-is-spawn-even-if-dead-socket-exist.patch
Patch0005: 0005-rpc-socket-Minor-cleanups.patch
Patch0006: 0006-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch
Patch0007: 0007-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch
# Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
Patch0008: 0008-security-Do-not-restore-kernel-and-initrd-labels.patch
# polkit: Allow password-less access for 'libvirt' group (bz #957300)
Patch0001: 0001-polkit-Allow-password-less-access-for-libvirt-group.patch
Patch0009: 0009-polkit-Allow-password-less-access-for-libvirt-group.patch
%if %{with_libvirtd}
Requires: libvirt-daemon = %{version}-%{release}
@ -2297,6 +2312,15 @@ exit 0
%doc examples/systemtap
%changelog
* Wed Jan 20 2016 Cole Robinson <crobinso@redhat.com> - 1.2.13.2-2
- Fix XML validation with qemu commandline passthrough (bz #1292131)
- Fix crash in libvirt_leasehelper (bz #1202350)
- Generate consistent systemtap tapsets regardless of host arch (bz
#1173641)
- Fix qemu:///session error 'Transport endpoint is not connected' (bz
#1271183)
- Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
* Wed Dec 23 2015 Cole Robinson <crobinso@redhat.com> - 1.2.13.2-1
- Rebased to version 1.2.13.2
- disk backend is not removed properly when disk frontent hotplug fails (bz