From bac86dd36e2c8c56e3d5678a94fc69f8e41a7d35 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 29 Jan 2024 16:59:20 +0100 Subject: [PATCH] virPCIDeviceGetVPD: Fix multiple error handling bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- src/util/virpci.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) 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)); + virPCIDeviceGetName(dev)); return NULL; } + if ((fd = open(vpdPath, O_RDONLY)) < 0) { - virReportSystemError(-fd, _("Failed to open a VPD file '%1$s'"), vpdPath); - return NULL; - } - res = virPCIVPDParse(fd); - - if (VIR_CLOSE(fd) < 0) { - virReportSystemError(errno, _("Unable to close the VPD file, fd: %1$d"), fd); + virReportSystemError(errno, _("Failed to open a VPD file '%1$s'"), vpdPath); return NULL; } - return g_steal_pointer(&res); + return virPCIVPDParse(fd); } #else