summaryrefslogtreecommitdiffstats
path: root/sys-utils/lscpu-dmi.c
diff options
context:
space:
mode:
authorKarel Zak2017-06-13 12:15:11 +0200
committerKarel Zak2017-06-13 12:15:11 +0200
commitc972852b29391c35b1d5c7d3e1e6413e0cc86908 (patch)
tree52a51be0c7c7cc2d922f4a63e8883179f00ce82a /sys-utils/lscpu-dmi.c
parentlibsmartcols: (docs) add new functions (diff)
downloadkernel-qcow2-util-linux-c972852b29391c35b1d5c7d3e1e6413e0cc86908.tar.gz
kernel-qcow2-util-linux-c972852b29391c35b1d5c7d3e1e6413e0cc86908.tar.xz
kernel-qcow2-util-linux-c972852b29391c35b1d5c7d3e1e6413e0cc86908.zip
lscpu: cleanup DMI detection return codes
Michal wrote: There is weird mix of logic in lscpu-dmi.c which sometimes returns 0 and sometimes -1 on error. Since most checks are if (rc) goto done; this bails out early on error skipping some detection methods. Further, in lscpu.c all following detections are guarder by if(hyper) so returning -1 causes all following methods to be skipped. Reported-by: Michal Suchanek <msuchanek@suse.de> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/lscpu-dmi.c')
-rw-r--r--sys-utils/lscpu-dmi.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c
index 3ba999124..4b845b97c 100644
--- a/sys-utils/lscpu-dmi.c
+++ b/sys-utils/lscpu-dmi.c
@@ -174,7 +174,7 @@ done:
static int hypervisor_decode_legacy(uint8_t *buf, const char *devmem)
{
if (!checksum(buf, 0x0F))
- return HYPER_NONE;
+ return -1;
return hypervisor_from_dmi_table(DWORD(buf + 0x08), WORD(buf + 0x06),
WORD(buf + 0x0C),
@@ -254,11 +254,15 @@ int read_hypervisor_dmi(void)
|| sizeof(uint16_t) != 2
|| sizeof(uint32_t) != 4
|| '\0' != 0)
- return rc;
+ goto done;
+ /* -1 : no DMI in /sys,
+ * 0 : DMI exist, nothing detected (HYPER_NONE)
+ * >0 : hypervisor detected
+ */
rc = hypervisor_decode_sysfw();
- if (rc >= 0)
- return rc;
+ if (rc >= HYPER_NONE)
+ goto done;
/* First try EFI (ia64, Intel-based Mac) */
switch (address_from_efi(&fp)) {
@@ -273,8 +277,9 @@ int read_hypervisor_dmi(void)
goto done;
rc = hypervisor_decode_smbios(buf, _PATH_DEV_MEM);
- if (rc)
+ if (rc >= HYPER_NONE)
goto done;
+
free(buf);
buf = NULL;
memory_scan:
@@ -287,17 +292,17 @@ memory_scan:
for (fp = 0; fp <= 0xFFF0; fp += 16) {
if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0) {
rc = hypervisor_decode_smbios(buf + fp, _PATH_DEV_MEM);
- if (rc == -1)
+ if (rc < 0)
fp += 16;
} else if (memcmp(buf + fp, "_DMI_", 5) == 0)
rc = hypervisor_decode_legacy(buf + fp, _PATH_DEV_MEM);
- if (rc >= 0)
+ if (rc >= HYPER_NONE)
break;
}
#endif
done:
free(buf);
- return rc;
+ return rc < 0 ? HYPER_NONE : rc;
}