使ってみて
tv.tv_sec = 1;
tv.tv_usec = 500000;
tv_usec
10^6 を超える値を受け入れない実装を見てきました。
編集:この問題は、少し掘り下げるのに十分興味深いものです。カーネル ソース コードを探しているとSO_RCVTIMEO
、次のコードが見つかりましたnet/core/sock.c
。
int sock_setsockopt(struct socket *sock, int level, int optname,
char __user *optval, unsigned int optlen)
{
/ ... /
switch (optname) {
/ ... /
case SO_RCVTIMEO:
ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen);
break;
/ ... /
}
関数の先頭には、sock_set_timeout()
実際にいくつかの範囲チェックが含まれています。
static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
{
struct timeval tv;
if (optlen < sizeof(tv))
return -EINVAL;
if (copy_from_user(&tv, optval, sizeof(tv)))
return -EFAULT;
if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC)
return -EDOM;
/* ... */
}
これで、いくつかの -ing を実行するのに十分なことがわかりましたgit blame
:) この変更は、次の変更セットで導入されました:
commit ba78073e6f70cd9c64a478a9bd901d7c8736cfbc
Author: Vasily Averin <vvs@sw.ru>
Date: Thu May 24 16:58:54 2007 -0700
[NET]: "wrong timeout value" in sk_wait_data() v2
sys_setsockopt() do not check properly timeout values for
SO_RCVTIMEO/SO_SNDTIMEO, for example it's possible to set negative timeout
values. POSIX do not defines behaviour for sys_setsockopt in case negative
timeouts, but requires that setsockopt() shall fail with -EDOM if the send and
receive timeout values are too big to fit into the timeout fields in the socket
structure.
In current implementation negative timeout can lead to error messages like
"schedule_timeout: wrong timeout value".
Proposed patch:
- checks tv_usec and returns -EDOM if it is wrong
- do not allows to set negative timeout values (sets 0 instead) and outputs
ratelimited information message about such attempts.
Signed-off-By: Vasily Averin <vvs@sw.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
コミットコメントがすべてを説明していると思います。私が見る限り、この変更は 2.6.22-rc3 に含まれていました。