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.

Reply via email to