From 69cdb11fba9e6a6a8c2d518111fe7dc44d622bbd Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 20 Oct 2023 10:14:39 +0200 Subject: [PATCH] virhostmem: Get total memory on macOS properly MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Problem with HW_PHYSMEM sysctl on 64-bit macOS is that it returns a 32-bit signed value. Thus it overflows. Switching to HW_MEMSIZE is recommended as it's of an uint_64 type [1]. 1: https://github.com/apple-oss-distributions/xnu/blob/xnu-10002.1.13/bsd/sys/sysctl.h Reported-by: Jaroslav Suchanek Signed-off-by: Michal Privoznik Reviewed-by: Daniel P. Berrangé --- src/util/virhostmem.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c index 1da2759ac3..a7027af835 100644 --- a/src/util/virhostmem.c +++ b/src/util/virhostmem.c @@ -617,7 +617,10 @@ virHostMemGetTotal(void) unsigned long long physmem = 0; size_t len = sizeof(physmem); - if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) < 0) { + /* On macOS hw.physmem is int32_t which doesn't fly with >4GiB of memory. + * But hw.memsize is uint64_t. */ + if (sysctlbyname("hw.memsize", &physmem, &len, NULL, 0) < 0 && + sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) < 0) { virReportSystemError(errno, "%s", _("Unable to query memory total")); return 0; -- 2.47.3