On 08/03/17 23:28, Hans Petter Selasky wrote:
> On 08/03/17 16:37, Conrad Meyer wrote:
>> Is it not important that the subtraction and result are evaluated
>> without truncation?
> 
> ticks is a circular counter. Assuming time = 0 and jiffies = -1U, then "delay"
> becomes a very large negative value, because long is used, and the delay <= 0
> check, is no longer working like expected.
> 
> Casting to "int" or truncating is the right thing to do in this case.

Signed integer overflow is undefined.  Using 'int' is liable to cause problems
after 2^32 ticks.

Colin Percival

>>> Log:
>>>    Ticks are 32-bit in FreeBSD.
>>>
>>>    MFC after:    3 days
>>>    Sponsored by: Mellanox Technologies
>>>
>>> Modified:
>>>    head/sys/ofed/drivers/infiniband/core/addr.c
>>>
>>> Modified: head/sys/ofed/drivers/infiniband/core/addr.c
>>> ==============================================================================
>>> --- head/sys/ofed/drivers/infiniband/core/addr.c        Thu Aug  3 09:14:43
>>> 2017        (r321984)
>>> +++ head/sys/ofed/drivers/infiniband/core/addr.c        Thu Aug  3 09:18:25
>>> 2017        (r321985)
>>> @@ -187,10 +187,10 @@ EXPORT_SYMBOL(rdma_translate_ip);
>>>
>>>   static void set_timeout(unsigned long time)
>>>   {
>>> -       unsigned long delay;
>>> +       int delay;      /* under FreeBSD ticks are 32-bit */
>>>
>>>          delay = time - jiffies;
>>> -       if ((long)delay <= 0)
>>> +       if (delay <= 0)
>>>                  delay = 1;
>>>
>>>          mod_delayed_work(addr_wq, &work, delay);

-- 
Colin Percival
Security Officer Emeritus, FreeBSD | The power to serve
Founder, Tarsnap | www.tarsnap.com | Online backups for the truly paranoid
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to