]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: cleanup DMI detection return codes
authorKarel Zak <kzak@redhat.com>
Tue, 13 Jun 2017 10:15:11 +0000 (12:15 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 23 Jun 2017 13:14:34 +0000 (15:14 +0200)
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>
sys-utils/lscpu-dmi.c

index 3ba999124a2e736ce76cb55c8eb1ea6742ce9a66..4b845b97ccd90d082156b5aa4398f6e885519ce5 100644 (file)
@@ -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;
 }