[BZ#15448] Fix integer overflow in sysdeps/unix/sysv/linux/bits/sched.h

Andreas Jaeger aj@suse.com
Thu May 9 15:11:00 GMT 2013


On 05/09/2013 04:53 PM, Will Newton wrote:
> On 9 May 2013 15:48, Andreas Jaeger <aj@suse.com> wrote:
>>
>>  From Bugzilla:
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> In file sysdeps/unix/sysv/linux/bits/sched.h, the cpu set macros attempt to
>> check for overflow of the cpu index, but fail to do so properly due to an
>> integer overflow error. The condition:
>>
>>   147       __cpu < 8 * (setsize)
>>
>> overflows if setsize is greater than SIZE_MAX/8. The correct test would be:
>>
>>             __cpu/8 < (setsize)
>>
>> which is valid since the low 3 bits of __cpu are irrelevant to whether the
>> index overflows.
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> I've fixed all three occurences of this problem.
>>
>> Ok to commit?
>>
>> Andreas
>>
>> 2013-05-09  Andreas Jaeger  <aj@suse.de>
>>
>>          [BZ #15448]
>>          * sysdeps/unix/sysv/linux/bits/sched.h (__CPU_SET_S)
>>          (__CPU_CLR_S, __CPU_ISSET_S): Avoid integer overflow.
>>
>> diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
>> index 5e8057b..9513155 100644
>> --- a/sysdeps/unix/sysv/linux/bits/sched.h
>> +++ b/sysdeps/unix/sysv/linux/bits/sched.h
>> @@ -144,21 +144,21 @@ typedef struct
>>   # define __CPU_SET_S(cpu, setsize, cpusetp) \
>>     (__extension__                                                             \
>>      ({ size_t __cpu = (cpu);                                                  \
>> -      __cpu < 8 * (setsize)                                                  \
>> +      __cpu / 8 < (setsize)                                                  \
>>         ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]                      \
>>           |= __CPUMASK (__cpu))                                                \
>>         : 0; }))
>>   # define __CPU_CLR_S(cpu, setsize, cpusetp) \
>>     (__extension__                                                             \
>>      ({ size_t __cpu = (cpu);                                                  \
>> -      __cpu < 8 * (setsize)                                                  \
>> +      __cpu /8 < (setsize)                                                   \
>
> Should be a space before the 8?


Yes, sure. Will fix in my commit once approved.

thanks,
Andreas
-- 
  Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
   SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
    GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
     GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126



More information about the Libc-alpha mailing list