mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
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:
parent
3ca1079318
commit
bac86dd36e
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user