]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Match firmware with fully resolved and canonicalized paths
authorJames Le Cuirot <jlecuirot@microsoft.com>
Thu, 24 Jul 2025 13:49:38 +0000 (14:49 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 29 Jul 2025 08:40:47 +0000 (10:40 +0200)
Distros may provide compatibility symlinks after moving firmware files
around, but they won't work for existing VMs when doing a straight
string comparison.

I tried to compare inodes instead, but even glib doesn't provide a
straightforward cross-platform method to do this.

Resolves: https://bugs.gentoo.org/960591
Signed-off-by: James Le Cuirot <jlecuirot@microsoft.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_firmware.c

index f10137144e85fc582b41f45609548681297aadf7..69e77d66f5ab9313c9c52dfbd60ad15564b8c837 100644 (file)
@@ -33,6 +33,7 @@
 #include "viralloc.h"
 #include "virenum.h"
 #include "virstring.h"
+#include "virfile.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -939,23 +940,23 @@ qemuFirmwareMatchesPaths(const qemuFirmware *fw,
     switch (fw->mapping.device) {
     case QEMU_FIRMWARE_DEVICE_FLASH:
         if (loader && loader->path &&
-            STRNEQ(loader->path, flash->executable.filename))
+            !virFileComparePaths(loader->path, flash->executable.filename))
             return false;
         if (loader && loader->nvramTemplate) {
             if (flash->mode != QEMU_FIRMWARE_FLASH_MODE_SPLIT)
                 return false;
-            if (STRNEQ(loader->nvramTemplate, flash->nvram_template.filename))
+            if (!virFileComparePaths(loader->nvramTemplate, flash->nvram_template.filename))
                 return false;
         }
         break;
     case QEMU_FIRMWARE_DEVICE_MEMORY:
         if (loader && loader->path &&
-            STRNEQ(loader->path, memory->filename))
+            !virFileComparePaths(loader->path, memory->filename))
             return false;
         break;
     case QEMU_FIRMWARE_DEVICE_KERNEL:
         if (kernelPath &&
-            STRNEQ(kernelPath, kernel->filename))
+            !virFileComparePaths(kernelPath, kernel->filename))
             return false;
         break;
     case QEMU_FIRMWARE_DEVICE_NONE:
@@ -1676,7 +1677,7 @@ qemuFirmwareFillDomainLegacy(virQEMUDriver *driver,
     for (i = 0; i < cfg->nfirmwares; i++) {
         virFirmware *fw = cfg->firmwares[i];
 
-        if (STRNEQ(fw->name, loader->path)) {
+        if (!virFileComparePaths(fw->name, loader->path)) {
             VIR_DEBUG("Not matching loader path '%s' for user provided path '%s'",
                       fw->name, loader->path);
             continue;