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/sy...
Reported-by: Jaroslav Suchanek <jsuchane(a)redhat.com>
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
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.41.0