On Tue, 2019-11-05 at 14:44 +0100, Jan Beich wrote: > 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.
I think you are confused. The fourth argument to sysctl(2) is the address of a size_t that contains sizeof the third argument before the call. Also HW_PHYSMEM64 is int64_t on OpenBSD. -Kurt
