]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virPCIDeviceGetVPD: Fix multiple error handling bugs
authorPeter Krempa <pkrempa@redhat.com>
Mon, 29 Jan 2024 15:59:20 +0000 (16:59 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 31 Jan 2024 16:24:07 +0000 (17:24 +0100)
- fix passing of 'errno' to 'virReportSystemError'

 The 'open' syscall returns '-1' and sets 'errno' on failure. The code
 passed '-fd' as 'errno' rather than errno itself, thus always reporting
 EPERM.

- don't overwrite errors when closing FD

 Use VIR_AUTOCLOSE to avoid overwriting the errors from virPCIVPDParse.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/util/virpci.c

index 99e6e6cbb1921b6323f92f48d34d7bdfc313e83c..780b4f9eec34941736f0be070ef3418f61df54ad 100644 (file)
@@ -3103,28 +3103,21 @@ virPCIDeviceHasVPD(virPCIDevice *dev)
 virPCIVPDResource *
 virPCIDeviceGetVPD(virPCIDevice *dev)
 {
-    g_autofree char *vpdPath = NULL;
-    int fd;
-    g_autoptr(virPCIVPDResource) res = NULL;
+    g_autofree char *vpdPath = virPCIFile(dev->name, "vpd");
+    VIR_AUTOCLOSE fd = -1;
 
-    vpdPath = virPCIFile(dev->name, "vpd");
     if (!virPCIDeviceHasVPD(dev)) {
         virReportError(VIR_ERR_INTERNAL_ERROR, _("Device %1$s does not have a VPD"),
-                virPCIDeviceGetName(dev));
-        return NULL;
-    }
-    if ((fd = open(vpdPath, O_RDONLY)) < 0) {
-        virReportSystemError(-fd, _("Failed to open a VPD file '%1$s'"), vpdPath);
+                       virPCIDeviceGetName(dev));
         return NULL;
     }
-    res = virPCIVPDParse(fd);
 
-    if (VIR_CLOSE(fd) < 0) {
-        virReportSystemError(errno, _("Unable to close the VPD file, fd: %1$d"), fd);
+    if ((fd = open(vpdPath, O_RDONLY)) < 0) {
+        virReportSystemError(errno, _("Failed to open a VPD file '%1$s'"), vpdPath);
         return NULL;
     }
 
-    return g_steal_pointer(&res);
+    return virPCIVPDParse(fd);
 }
 
 #else