mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
[NET]: Make sure l_linger is unsigned to avoid negative timeouts
One of my x86_64 (linux 2.6.13) server log is filled with : schedule_timeout: wrong timeout value ffffffffffffff06 from ffffffff802e63ca schedule_timeout: wrong timeout value ffffffffffffff06 from ffffffff802e63ca schedule_timeout: wrong timeout value ffffffffffffff06 from ffffffff802e63ca schedule_timeout: wrong timeout value ffffffffffffff06 from ffffffff802e63ca schedule_timeout: wrong timeout value ffffffffffffff06 from ffffffff802e63ca This is because some application does a struct linger li; li.l_onoff = 1; li.l_linger = -1; setsockopt(sock, SOL_SOCKET, SO_LINGER, &li, sizeof(li)); And unfortunatly l_linger is defined as a 'signed int' in include/linux/socket.h: struct linger { int l_onoff; /* Linger active */ int l_linger; /* How long to linger for */ }; I dont know if it's safe to change l_linger to 'unsigned int' in the include file (It might be defined as int in ABI specs) Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fe2d5295a1
commit
9261c9b042
@ -341,11 +341,11 @@ set_rcvbuf:
|
||||
sock_reset_flag(sk, SOCK_LINGER);
|
||||
else {
|
||||
#if (BITS_PER_LONG == 32)
|
||||
if (ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
|
||||
if ((unsigned int)ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
|
||||
sk->sk_lingertime = MAX_SCHEDULE_TIMEOUT;
|
||||
else
|
||||
#endif
|
||||
sk->sk_lingertime = ling.l_linger * HZ;
|
||||
sk->sk_lingertime = (unsigned int)ling.l_linger * HZ;
|
||||
sock_set_flag(sk, SOCK_LINGER);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user