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 <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2024-01-29 16:59:20 +01:00
parent 3ca1079318
commit bac86dd36e

View File

@ -3103,28 +3103,21 @@ virPCIDeviceHasVPD(virPCIDevice *dev)
virPCIVPDResource * virPCIVPDResource *
virPCIDeviceGetVPD(virPCIDevice *dev) virPCIDeviceGetVPD(virPCIDevice *dev)
{ {
g_autofree char *vpdPath = NULL; g_autofree char *vpdPath = virPCIFile(dev->name, "vpd");
int fd; VIR_AUTOCLOSE fd = -1;
g_autoptr(virPCIVPDResource) res = NULL;
vpdPath = virPCIFile(dev->name, "vpd");
if (!virPCIDeviceHasVPD(dev)) { if (!virPCIDeviceHasVPD(dev)) {
virReportError(VIR_ERR_INTERNAL_ERROR, _("Device %1$s does not have a VPD"), virReportError(VIR_ERR_INTERNAL_ERROR, _("Device %1$s does not have a VPD"),
virPCIDeviceGetName(dev)); virPCIDeviceGetName(dev));
return NULL; return NULL;
} }
if ((fd = open(vpdPath, O_RDONLY)) < 0) { if ((fd = open(vpdPath, O_RDONLY)) < 0) {
virReportSystemError(-fd, _("Failed to open a VPD file '%1$s'"), vpdPath); virReportSystemError(errno, _("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);
return NULL; return NULL;
} }
return g_steal_pointer(&res); return virPCIVPDParse(fd);
} }
#else #else