In BSD systems other than macOS, since 9806f5a7bf (gc --auto: exclude base pack if not enough mem to "repack -ad", 2018-04-15), sysctl() use HW_PHYSMEM with the wrong size for the target. Use the correct type for physical_memory on each option and make sure it is initialized, so it is safe to use even if sysctl() fails. While at it, add a cast to the returned value for consistency. Signed-off-by: Carlo Marcelo Arenas Belón <carenas@xxxxxxxxx> --- builtin/gc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/builtin/gc.c b/builtin/gc.c index 845876ff02..3b2ca99af9 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -539,21 +539,25 @@ 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; int mib[2]; size_t length; - - mib[0] = CTL_HW; # if defined(HW_MEMSIZE) + int64_t physical_memory = 0; + mib[1] = HW_MEMSIZE; # elif defined(HW_PHYSMEM64) + int64_t physical_memory = 0; + mib[1] = HW_PHYSMEM64; # else + int physical_memory = 0; + mib[1] = HW_PHYSMEM; # endif - length = sizeof(int64_t); + mib[0] = CTL_HW; + length = sizeof(physical_memory); if (!sysctl(mib, 2, &physical_memory, &length, NULL, 0)) - return physical_memory; + return (uint64_t)physical_memory; #elif defined(GIT_WINDOWS_NATIVE) MEMORYSTATUSEX memInfo; -- 2.50.0.147.gafe0d4ec5b