mirror of
https://github.com/nginx/nginx.git
synced 2025-07-23 05:41:07 +08:00
QUIC: ngx_msec_t overflow protection.
On some systems the value of ngx_current_msec is derived from monotonic clock, for which the following is defined by POSIX: For this clock, the value returned by clock_gettime() represents the amount of time (in seconds and nanoseconds) since an unspecified point in the past. As as result, overflow protection is needed when comparing two ngx_msec_t. The change adds such protection to the ngx_quic_detect_lost() function.
This commit is contained in:
parent
38236bf74f
commit
1e883a40db
@ -449,9 +449,10 @@ ngx_quic_detect_lost(ngx_connection_t *c, ngx_quic_ack_stat_t *st)
|
|||||||
now = ngx_current_msec;
|
now = ngx_current_msec;
|
||||||
thr = ngx_quic_lost_threshold(qc);
|
thr = ngx_quic_lost_threshold(qc);
|
||||||
|
|
||||||
/* send time of lost packets across all send contexts */
|
#if (NGX_SUPPRESS_WARN)
|
||||||
oldest = NGX_TIMER_INFINITE;
|
oldest = now;
|
||||||
newest = NGX_TIMER_INFINITE;
|
newest = now;
|
||||||
|
#endif
|
||||||
|
|
||||||
nlost = 0;
|
nlost = 0;
|
||||||
|
|
||||||
@ -484,13 +485,17 @@ ngx_quic_detect_lost(ngx_connection_t *c, ngx_quic_ack_stat_t *st)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start->send_time > qc->first_rtt) {
|
if ((ngx_msec_int_t) (start->send_time - qc->first_rtt) > 0) {
|
||||||
|
|
||||||
if (oldest == NGX_TIMER_INFINITE || start->send_time < oldest) {
|
if (nlost == 0
|
||||||
|
|| (ngx_msec_int_t) (start->send_time - oldest) < 0)
|
||||||
|
{
|
||||||
oldest = start->send_time;
|
oldest = start->send_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newest == NGX_TIMER_INFINITE || start->send_time > newest) {
|
if (nlost == 0
|
||||||
|
|| (ngx_msec_int_t) (start->send_time - newest) > 0)
|
||||||
|
{
|
||||||
newest = start->send_time;
|
newest = start->send_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,8 +516,9 @@ ngx_quic_detect_lost(ngx_connection_t *c, ngx_quic_ack_stat_t *st)
|
|||||||
* latest ACK frame.
|
* latest ACK frame.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (st && nlost >= 2 && (st->newest < oldest || st->oldest > newest)) {
|
if (st && nlost >= 2 && ((ngx_msec_int_t) (st->newest - oldest) < 0
|
||||||
|
|| (ngx_msec_int_t) (st->oldest - newest) > 0))
|
||||||
|
{
|
||||||
if (newest - oldest > ngx_quic_pcg_duration(c)) {
|
if (newest - oldest > ngx_quic_pcg_duration(c)) {
|
||||||
ngx_quic_persistent_congestion(c);
|
ngx_quic_persistent_congestion(c);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user