]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/gc: correct total_ram calculation with HAVE_BSD_SYSCTL
authorCarlo Marcelo Arenas Belón <carenas@gmail.com>
Mon, 7 Jul 2025 16:45:18 +0000 (09:45 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Jul 2025 17:04:32 +0000 (10:04 -0700)
The calls to sysctl() assume a 64-bit memory size for the variable
holding the value, but the actual size depends on the key name and
platform, at least for HW_PHYSMEM.

Detect any mismatched reads, and retry with a shorter variable
when needed.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c

index 7dc94f243d7dc62059f025cc9495ca6491729698..6880f5b13ddc800cc7d646196b740f2cc5da017a 100644 (file)
@@ -517,7 +517,7 @@ static uint64_t total_ram(void)
                return total;
        }
 #elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM) || defined(HW_PHYSMEM64))
-       int64_t physical_memory;
+       uint64_t physical_memory;
        int mib[2];
        size_t length;
 
@@ -529,9 +529,16 @@ static uint64_t total_ram(void)
 # else
        mib[1] = HW_PHYSMEM;
 # endif
-       length = sizeof(int64_t);
-       if (!sysctl(mib, 2, &physical_memory, &length, NULL, 0))
+       length = sizeof(physical_memory);
+       if (!sysctl(mib, 2, &physical_memory, &length, NULL, 0)) {
+               if (length == 4) {
+                       uint32_t mem;
+
+                       if (!sysctl(mib, 2, &mem, &length, NULL, 0))
+                               physical_memory = mem;
+               }
                return physical_memory;
+       }
 #elif defined(GIT_WINDOWS_NATIVE)
        MEMORYSTATUSEX memInfo;