NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/45634: hardclock_ticks corner cases in vflushnext() et al

>Number:         45634
>Category:       kern
>Synopsis:       hardclock_ticks corner cases in vflushnext() et al
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Nov 19 21:00:00 +0000 2011
>Originator:     Christian Biere
File: sys/kern/vfs_mount.c
Function: vflushnext()

1. The comparision "hardclock_ticks > *when" apparently assumes perfect 
integers whilst "hardclock_ticks" will actually wrap around (at least that's 
the hope) after some time. Therefore this comparision is insufficient to verify 
has advanced one or more ticks. If *when is initialized just before a wrap 
around (e.g. to INT_MAX) and hardclock_ticks wraps around to INT_MIN, the 
comparision will unintentionally fail. [*]

2. The expression "hardclock_ticks + hz / 10" may result in an integer overflow 
and hence cause undefined behavior.

File: sys/kern/kern_clock.c
Function: hardclock()

3. As "hardclock_ticks" is of type signed int an integer overflow occures after 
some defined run-time depending on the value of "hz". [*]
While changing its type to unsigned int would fix this issue allowing a 
well-defined wrap around, this would require further changes in code using this 
variable. Therefore, side effects can be avoid by the following:

 hardclock_ticks = (unsigned int) hardclock_ticks + 1;

However, it might actually be worthwhile to check the uses of "hardclock_ticks" 
elsewhere anyways. For example, it seems the wrap around is not taken into 
account in lacp_sm_tx() in net/agr/ieee8023ad_lacp_sm_tx.c as well as other 

[*] Assuming hz is set to 100, the apparent compile-time default, these 
circumstances may arise about every 249 days. Thus, a higher value of hz will 
increase the likeliness in proportion (e.g. 25 days at 1000 hz). 



Home | Main Index | Thread Index | Old Index