Kurt Miller <[email protected]> writes: > On Tue, 2019-11-05 at 09:17 +0100, Jan Beich wrote: > >> Jeremie Courreges-Anglas <[email protected]> writes: >> >> > >> > ++#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) || >> > defined(HW_PHYSMEM64)) >> > + int64_t physical_memory; >> HW_MEMSIZE and HW_PHYSMEM64 return uint64_t, not int64_t. >> >> > >> > ++#elif defined(HAVE_BSD_SYSCTL) && defined(HW_PHYSMEM)) >> > ++ int physical_memory; >> HW_PHYSMEM returns u_long (unsigned long) on DragonFly and FreeBSD. >> int or signed long may upset -fsanitize=integer on 32-bit archs. >> >> Note, the code can be simplified via sysconf(3). >> >> --- builtin/gc.c 2019-11-04 05:07:07 UTC >> +++ builtin/gc.c >> @@ -243,20 +243,27 @@ static uint64_t total_ram(void) >> >> if (!sysinfo(&si)) >> return si.totalram; >> -#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) || >> defined(HW_PHYSMEM)) >> - int64_t physical_memory; >> - int mib[2]; >> - size_t length; >> - >> - mib[0] = CTL_HW; >> +#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) || >> defined(HW_PHYSMEM64) || defined(HW_PHYSMEM)) >> +# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64) >> + uint64_t physical_memory; >> +# else >> + u_long physical_memory; >> +# endif >> + int mib[2] = { >> + CTL_HW, >> # if defined(HW_MEMSIZE) >> - mib[1] = HW_MEMSIZE; >> + HW_MEMSIZE, >> +# elif defined(HW_PHYSMEM64) >> + HW_PHYSMEM64, >> # else >> - mib[1] = HW_PHYSMEM; >> + HW_PHYSMEM, >> # endif >> - length = sizeof(int64_t); >> + }; >> + size_t length = sizeof(mib); > > size_t length = sizeof(physical_memory);
Sorry. sizeof(int[2]) > sizeof(unsigned long) on i386, so sysctl(3) could overflow &physical_memory iff FreeBSD kernel tried to return larger value or padded it with junk/zeros.
