diff --git a/0001-libxl-add-support-for-BlockResize-API.patch b/0001-libxl-add-support-for-BlockResize-API.patch index 517d0df..ab415ba 100644 --- a/0001-libxl-add-support-for-BlockResize-API.patch +++ b/0001-libxl-add-support-for-BlockResize-API.patch @@ -120,7 +120,7 @@ Index: libvirt-7.1.0/src/libxl/libxl_driver.c static int libxlDomainGetJobInfo(virDomainPtr dom, virDomainJobInfoPtr info) -@@ -6607,6 +6697,7 @@ static virHypervisorDriver libxlHypervis +@@ -6610,6 +6700,7 @@ static virHypervisorDriver libxlHypervis #endif .nodeGetFreeMemory = libxlNodeGetFreeMemory, /* 0.9.0 */ .nodeGetCellsFreeMemory = libxlNodeGetCellsFreeMemory, /* 1.1.1 */ diff --git a/6b8e9613-avoid-use-after-free.patch b/6b8e9613-avoid-use-after-free.patch new file mode 100644 index 0000000..2311654 --- /dev/null +++ b/6b8e9613-avoid-use-after-free.patch @@ -0,0 +1,27 @@ +commit 6b8e961399549c5c8fdf06875e5981c564829ad6 +Author: Peter Krempa +Date: Fri Mar 12 10:12:51 2021 +0100 + + virLockSpacePreExecRestart: Avoid use-after-free + + Recent refactor marked 'object' which is returned from the function as + autofree but forgot to use g_steal_pointer in the return statement to + prevent freeing it. + + Fixes: 9a1651f64d7 + Signed-off-by: Peter Krempa + Reviewed-by: Michal Privoznik + +Index: libvirt-7.1.0/src/util/virlockspace.c +=================================================================== +--- libvirt-7.1.0.orig/src/util/virlockspace.c ++++ libvirt-7.1.0/src/util/virlockspace.c +@@ -472,7 +472,7 @@ virJSONValuePtr virLockSpacePreExecResta + goto error; + + virMutexUnlock(&lockspace->lock); +- return object; ++ return g_steal_pointer(&object); + + error: + virMutexUnlock(&lockspace->lock); diff --git a/c363f03e-virnetdaemon-intro-virNetDaemonQuitExecRestart.patch b/c363f03e-virnetdaemon-intro-virNetDaemonQuitExecRestart.patch new file mode 100644 index 0000000..5ea0d76 --- /dev/null +++ b/c363f03e-virnetdaemon-intro-virNetDaemonQuitExecRestart.patch @@ -0,0 +1,85 @@ +commit c363f03e6d0298416179c7f7b24f00da9d85a14f +Author: Peter Krempa +Date: Wed Mar 10 17:01:23 2021 +0100 + + virnetdaemon: Introduce virNetDaemonQuitExecRestart + + Recent changes which meant to fix daemon shutdown broke the exec-restart + capability of virtlogd and virtlockd, since the code actually closed all + the sockets and shut down all the internals. + + Add virNetDaemonQuitExecRestart, which requests a shutdown of the + process, but keeps all the services open and registered since they are + preserved across the restart. + + Signed-off-by: Peter Krempa + Reviewed-by: Michal Privoznik + +Index: libvirt-7.1.0/src/libvirt_remote.syms +=================================================================== +--- libvirt-7.1.0.orig/src/libvirt_remote.syms ++++ libvirt-7.1.0/src/libvirt_remote.syms +@@ -85,6 +85,7 @@ virNetDaemonNew; + virNetDaemonNewPostExecRestart; + virNetDaemonPreExecRestart; + virNetDaemonQuit; ++virNetDaemonQuitExecRestart; + virNetDaemonRemoveShutdownInhibition; + virNetDaemonRun; + virNetDaemonSetShutdownCallbacks; +Index: libvirt-7.1.0/src/rpc/virnetdaemon.c +=================================================================== +--- libvirt-7.1.0.orig/src/rpc/virnetdaemon.c ++++ libvirt-7.1.0/src/rpc/virnetdaemon.c +@@ -76,6 +76,7 @@ struct _virNetDaemon { + bool quit; + bool finished; + bool graceful; ++ bool execRestart; + + unsigned int autoShutdownTimeout; + size_t autoShutdownInhibitions; +@@ -857,6 +858,10 @@ virNetDaemonRun(virNetDaemonPtr dmn) + + virHashForEach(dmn->servers, daemonServerProcessClients, NULL); + ++ /* don't shutdown services when performing an exec-restart */ ++ if (dmn->quit && dmn->execRestart) ++ goto cleanup; ++ + if (dmn->quit && dmn->finishTimer == -1) { + virHashForEach(dmn->servers, daemonServerClose, NULL); + if (dmn->shutdownPrepareCb && dmn->shutdownPrepareCb() < 0) +@@ -912,6 +917,20 @@ virNetDaemonQuit(virNetDaemonPtr dmn) + virObjectUnlock(dmn); + } + ++ ++void ++virNetDaemonQuitExecRestart(virNetDaemon *dmn) ++{ ++ virObjectLock(dmn); ++ ++ VIR_DEBUG("Exec-restart requested %p", dmn); ++ dmn->quit = true; ++ dmn->execRestart = true; ++ ++ virObjectUnlock(dmn); ++} ++ ++ + static int + daemonServerClose(void *payload, + const char *key G_GNUC_UNUSED, +Index: libvirt-7.1.0/src/rpc/virnetdaemon.h +=================================================================== +--- libvirt-7.1.0.orig/src/rpc/virnetdaemon.h ++++ libvirt-7.1.0/src/rpc/virnetdaemon.h +@@ -75,6 +75,7 @@ void virNetDaemonSetStateStopWorkerThrea + void virNetDaemonRun(virNetDaemonPtr dmn); + + void virNetDaemonQuit(virNetDaemonPtr dmn); ++void virNetDaemonQuitExecRestart(virNetDaemon *dmn); + + bool virNetDaemonHasClients(virNetDaemonPtr dmn); + diff --git a/ccc6dd8f-fix-exec-restart.patch b/ccc6dd8f-fix-exec-restart.patch new file mode 100644 index 0000000..9edb1b2 --- /dev/null +++ b/ccc6dd8f-fix-exec-restart.patch @@ -0,0 +1,41 @@ +commit ccc6dd8f11f32f9387fd05de4ad98d61d4e88b69 +Author: Peter Krempa +Date: Wed Mar 10 17:14:18 2021 +0100 + + virtlo(g|ck)d: Fix exec-restart + + Commit 94e45d1042e broke exec-restart of virtlogd and virtlockd as the + code waiting for the daemon shutdown closed the daemons before + exec-restarting. + + Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1912243 + Fixes: 94e45d1042e + Signed-off-by: Peter Krempa + Reviewed-by: Michal Privoznik + +Index: libvirt-7.1.0/src/locking/lock_daemon.c +=================================================================== +--- libvirt-7.1.0.orig/src/locking/lock_daemon.c ++++ libvirt-7.1.0/src/locking/lock_daemon.c +@@ -336,7 +336,7 @@ virLockDaemonExecRestartHandler(virNetDa + void *opaque G_GNUC_UNUSED) + { + execRestart = true; +- virNetDaemonQuit(dmn); ++ virNetDaemonQuitExecRestart(dmn); + } + + static int +Index: libvirt-7.1.0/src/logging/log_daemon.c +=================================================================== +--- libvirt-7.1.0.orig/src/logging/log_daemon.c ++++ libvirt-7.1.0/src/logging/log_daemon.c +@@ -283,7 +283,7 @@ virLogDaemonExecRestartHandler(virNetDae + void *opaque G_GNUC_UNUSED) + { + execRestart = true; +- virNetDaemonQuit(dmn); ++ virNetDaemonQuitExecRestart(dmn); + } + + static int diff --git a/eab7ae6b-fix-array-access.patch b/eab7ae6b-fix-array-access.patch new file mode 100644 index 0000000..a54a544 --- /dev/null +++ b/eab7ae6b-fix-array-access.patch @@ -0,0 +1,40 @@ +commit eab7ae6bfe13503ea705e70e32edaa60357cbaa1 +Author: Peter Krempa +Date: Fri Mar 12 10:16:11 2021 +0100 + + virLockSpaceNewPostExecRestart: Fix out-of-bounds array access + + 'res->owners' is allocated to 'res->nOwners' elements, but unfortunately + 'res->nOwners' doesn't contain the proper value until after the + allocation so 0 elements are allocated. The following loop which assumes + that the array has the right number of elements then accesses the + pointer out of bounds. The bug was also faithfully converted from + VIR_ALLOC_N to g_new0. + + Fixes: 4a3d6ed5ee0 + Signed-off-by: Peter Krempa + Reviewed-by: Michal Privoznik + +Index: libvirt-7.1.0/src/util/virlockspace.c +=================================================================== +--- libvirt-7.1.0.orig/src/util/virlockspace.c ++++ libvirt-7.1.0/src/util/virlockspace.c +@@ -324,7 +324,6 @@ virLockSpacePtr virLockSpaceNewPostExecR + const char *tmp; + virJSONValuePtr owners; + size_t j; +- size_t m; + + res = g_new0(virLockSpaceResource, 1); + res->fd = -1; +@@ -384,9 +383,8 @@ virLockSpacePtr virLockSpaceNewPostExecR + goto error; + } + +- m = virJSONValueArraySize(owners); ++ res->nOwners = virJSONValueArraySize(owners); + res->owners = g_new0(pid_t, res->nOwners); +- res->nOwners = m; + + for (j = 0; j < res->nOwners; j++) { + unsigned long long int owner; diff --git a/libxl-default-pcistub-name.patch b/ee3dc2c2-libxl-default-pcistub-name.patch similarity index 64% rename from libxl-default-pcistub-name.patch rename to ee3dc2c2-libxl-default-pcistub-name.patch index 88b4c7e..54a8096 100644 --- a/libxl-default-pcistub-name.patch +++ b/ee3dc2c2-libxl-default-pcistub-name.patch @@ -1,4 +1,4 @@ -commit 844c278ad2a957592ba9fbf93c6aa076a2b3d216 +commit ee3dc2c2c8e5b2d3976e43dde95bc0aeeafbef4f Author: Jim Fehlig Date: Mon Mar 1 15:41:44 2021 -0700 @@ -7,6 +7,7 @@ Date: Mon Mar 1 15:41:44 2021 -0700 Commit 887dd0d331 caused a small regression in NodeDeviceDetach in the libxl driver when the 'driver' parameter is not specified. E.g. + # virsh nodedev-detach pci_0000_0a_10_0 error: Failed to detach device pci_0000_0a_10_0 error: An error occurred, but the cause is unknown @@ -16,18 +17,21 @@ Date: Mon Mar 1 15:41:44 2021 -0700 "xen" if it is not specified when invoking NodeDeviceDetach. Signed-off-by: Jim Fehlig + Reviewed-by: Pavel Hrdina -diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c -index 75a8d46af0..348434ca72 100644 ---- a/src/libxl/libxl_driver.c -+++ b/src/libxl/libxl_driver.c -@@ -5777,6 +5777,9 @@ libxlNodeDeviceDetachFlags(virNodeDevicePtr dev, +Index: libvirt-7.1.0/src/libxl/libxl_driver.c +=================================================================== +--- libvirt-7.1.0.orig/src/libxl/libxl_driver.c ++++ libvirt-7.1.0/src/libxl/libxl_driver.c +@@ -5777,7 +5777,10 @@ libxlNodeDeviceDetachFlags(virNodeDevice virCheckFlags(0, -1); +- if (driverName && STRNEQ(driverName, "xen")) { + if (!driverName) + driverName = "xen"; + - if (driverName && STRNEQ(driverName, "xen")) { ++ if (STRNEQ(driverName, "xen")) { virReportError(VIR_ERR_INVALID_ARG, _("unsupported driver name '%s'"), driverName); + return -1; diff --git a/libvirt.changes b/libvirt.changes index f325063..bcc8ada 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -1,3 +1,19 @@ +------------------------------------------------------------------- +Fri Mar 12 21:11:17 UTC 2021 - James Fehlig + +- virtlockd, virtlogd: Fix exec-restart + 6b8e9613-avoid-use-after-free.patch, + eab7ae6b-fix-array-access.patch, + c363f03e-virnetdaemon-intro-virNetDaemonQuitExecRestart.patch, + ccc6dd8f-fix-exec-restart.patch + bsc#1183411 + +------------------------------------------------------------------- +Wed Mar 10 18:37:38 UTC 2021 - James Fehlig + +- Replace libxl-default-pcistub-name.patch with upstream variant + ee3dc2c2-libxl-default-pcistub-name.patch + ------------------------------------------------------------------- Mon Mar 1 23:06:57 UTC 2021 - James Fehlig diff --git a/libvirt.spec b/libvirt.spec index 4f5ec1b..f48b600 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -291,10 +291,14 @@ Source6: libvirtd-relocation-server.xml Source99: baselibs.conf Source100: %{name}-rpmlintrc # Upstream patches +Patch0: ee3dc2c2-libxl-default-pcistub-name.patch +Patch1: 6b8e9613-avoid-use-after-free.patch +Patch2: eab7ae6b-fix-array-access.patch +Patch3: c363f03e-virnetdaemon-intro-virNetDaemonQuitExecRestart.patch +Patch4: ccc6dd8f-fix-exec-restart.patch # Patches pending upstream review Patch100: libxl-dom-reset.patch Patch101: network-don-t-use-dhcp-authoritative-on-static-netwo.patch -Patch102: libxl-default-pcistub-name.patch # Need to go upstream Patch150: libvirt-power8-models.patch Patch151: ppc64le-canonical-name.patch diff --git a/libxl-dom-reset.patch b/libxl-dom-reset.patch index e88ede4..ae30238 100644 --- a/libxl-dom-reset.patch +++ b/libxl-dom-reset.patch @@ -74,7 +74,7 @@ Index: libvirt-7.1.0/src/libxl/libxl_driver.c libxlDomainDestroyFlags(virDomainPtr dom, unsigned int flags) { -@@ -6485,6 +6540,7 @@ static virHypervisorDriver libxlHypervis +@@ -6488,6 +6543,7 @@ static virHypervisorDriver libxlHypervis .domainShutdown = libxlDomainShutdown, /* 0.9.0 */ .domainShutdownFlags = libxlDomainShutdownFlags, /* 0.9.10 */ .domainReboot = libxlDomainReboot, /* 0.9.0 */ diff --git a/libxl-set-migration-constraints.patch b/libxl-set-migration-constraints.patch index 486451d..85c2fe7 100644 --- a/libxl-set-migration-constraints.patch +++ b/libxl-set-migration-constraints.patch @@ -77,7 +77,7 @@ Index: libvirt-7.1.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-7.1.0.orig/src/libxl/libxl_driver.c +++ libvirt-7.1.0/src/libxl/libxl_driver.c -@@ -6047,6 +6047,9 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6050,6 +6050,9 @@ libxlDomainMigratePerform3Params(virDoma const char *dname = NULL; const char *uri = NULL; int ret = -1; @@ -87,7 +87,7 @@ Index: libvirt-7.1.0/src/libxl/libxl_driver.c #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME virReportUnsupportedError(); -@@ -6063,6 +6066,15 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6066,6 +6069,15 @@ libxlDomainMigratePerform3Params(virDoma virTypedParamsGetString(params, nparams, VIR_MIGRATE_PARAM_DEST_NAME, &dname) < 0 || @@ -103,7 +103,7 @@ Index: libvirt-7.1.0/src/libxl/libxl_driver.c virTypedParamsGetString(params, nparams, VIR_MIGRATE_PARAM_URI, &uri) < 0) -@@ -6077,11 +6089,11 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6080,11 +6092,11 @@ libxlDomainMigratePerform3Params(virDoma if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) { if (libxlDomainMigrationSrcPerformP2P(driver, vm, dom->conn, dom_xml,