From 3eaebd335936d8a1f8100b54c4d56b7d3cd9d68f Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 23 Apr 2026 09:35:03 +0800 Subject: [PATCH] Host (Linux): fixes host is missing in some machine Fixes #2279 --- src/detection/host/host_linux.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/detection/host/host_linux.c b/src/detection/host/host_linux.c index 3d4d04ba8..051dd8099 100644 --- a/src/detection/host/host_linux.c +++ b/src/detection/host/host_linux.c @@ -51,12 +51,32 @@ static bool getHostVendor(FFstrbuf* vendor) { const char* ffDetectHost(FFHostResult* host) { // This is a hack for Asahi Linux, whose product_family is empty - if (ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family)) { - ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name); + bool productName = ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name); + bool productFamily = ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family); + if (productName || productFamily) { ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_version", "/sys/class/dmi/id/product_version", &host->version); ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_sku", "/sys/class/dmi/id/product_sku", &host->sku); ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_serial", "/sys/class/dmi/id/product_serial", &host->serial); ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor); + +#if __x86_64__ + ffHostDetectMac(host); +#endif + + // KVM/Qemu virtual machine + if (ffStrbufStartsWithS(&host->name, "Standard PC")) { + ffStrbufPrependS(&host->name, "KVM/QEMU "); + } + +#if __aarch64__ + else if (host->family.length == 0 && ffStrbufEqualS(&host->vendor, "Apple Inc.") && ffStrbufStartsWithS(&host->name, "Mac")) { + // Hack for Asahi Linux + ffStrbufDestroy(&host->family); + ffStrbufInitMove(&host->family, &host->name); + getHostProductName(&host->name); + getHostSerialNumber(&host->serial); + } +#endif } else { getHostProductFamily(&host->family); getHostProductName(&host->name); @@ -64,15 +84,6 @@ const char* ffDetectHost(FFHostResult* host) { getHostVendor(&host->vendor); } -#ifdef __x86_64__ - ffHostDetectMac(host); -#endif - - // KVM/Qemu virtual machine - if (ffStrbufStartsWithS(&host->name, "Standard PC")) { - ffStrbufPrependS(&host->name, "KVM/QEMU "); - } - if (host->family.length == 0 && host->name.length == 0) { const char* wslDistroName = getenv("WSL_DISTRO_NAME"); // On WSL, the real host can't be detected. Instead use WSL as host.