Kurt Miller <[email protected]> writes:

> 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.

I didn't disagree. My reply was an attempt to understand what may go
wrong at runtime as the typo didn't trigger -fsanitize=address.

Reply via email to