From: Peter Krempa Date: Mon, 29 Jan 2024 15:59:20 +0000 (+0100) Subject: virPCIDeviceGetVPD: Fix multiple error handling bugs X-Git-Tag: v10.1.0-rc1~138 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bac86dd36e2c8c56e3d5678a94fc69f8e41a7d35;p=thirdparty%2Flibvirt.git virPCIDeviceGetVPD: Fix multiple error handling bugs - 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 Reviewed-by: Ján Tomko --- diff --git a/src/util/virpci.c b/src/util/virpci.c index 99e6e6cbb1..780b4f9eec 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -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