mirror of
https://github.com/nginx/nginx.git
synced 2024-12-03 04:39:00 +08:00
Fixed signed integer overflows in timer code (ticket #145).
Integer overflow is undefined behaviour in C and this indeed caused problems on Solaris/SPARC (at least in some cases). Fix is to subtract unsigned integers instead, and then cast result to a signed one, which is implementation-defined behaviour and used to work. Strictly speaking, we should compare (unsigned) result with the maximum value of the corresponding signed integer type instead, this will be defined behaviour. This will require much more changes though, and considered to be overkill for now.
This commit is contained in:
parent
bd6d421816
commit
baa239c487
@ -136,8 +136,7 @@ ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
|
||||
|
||||
/* node->key < temp->key */
|
||||
|
||||
p = ((ngx_rbtree_key_int_t) node->key - (ngx_rbtree_key_int_t) temp->key
|
||||
< 0)
|
||||
p = ((ngx_rbtree_key_int_t) (node->key - temp->key) < 0)
|
||||
? &temp->left : &temp->right;
|
||||
|
||||
if (*p == sentinel) {
|
||||
|
@ -67,7 +67,7 @@ ngx_event_find_timer(void)
|
||||
|
||||
ngx_mutex_unlock(ngx_event_timer_mutex);
|
||||
|
||||
timer = (ngx_msec_int_t) node->key - (ngx_msec_int_t) ngx_current_msec;
|
||||
timer = (ngx_msec_int_t) (node->key - ngx_current_msec);
|
||||
|
||||
return (ngx_msec_t) (timer > 0 ? timer : 0);
|
||||
}
|
||||
@ -95,8 +95,7 @@ ngx_event_expire_timers(void)
|
||||
|
||||
/* node->key <= ngx_current_time */
|
||||
|
||||
if ((ngx_msec_int_t) node->key - (ngx_msec_int_t) ngx_current_msec <= 0)
|
||||
{
|
||||
if ((ngx_msec_int_t) (node->key - ngx_current_msec) <= 0) {
|
||||
ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));
|
||||
|
||||
#if (NGX_THREADS)
|
||||
|
Loading…
Reference in New Issue
Block a user