4

カーネル2.6.18-194.el5 #1 SMP x86_64を使用して、RedHat がインストールされた Linux で動作するコードを実行しています。

CentOS 6.3 を搭載した新しくインストールしたマシンにコードを移動すると、同じコードが失敗しました。

ソケット オプションの割り当てエラー:ドメイン外の数値引数

後者のマシンのカーネル バージョンは2.6.32-279.el6.x86_64 #1 SMP

以下は、それぞれのマシンで機能しているコードと失敗しているコードです。

    struct timeval          tv;

    tv.tv_sec       = 0;
    tv.tv_usec      = 1500000;

    if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)) != 0)
    {
            LM_ERR("Error assigning socket option: %s", strerror( errno ));
            return FALSE;
    }
4

2 に答える 2

8

使ってみて

tv.tv_sec       = 1;
tv.tv_usec      = 500000;

tv_usec10^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 に含まれていました。

于 2012-12-14T22:07:53.057 に答える
4

そんなはずないでしょ

tv.tv_sec   = 1;
tv.tv_usec  = 500000;

100 万マイクロ秒 == 1 秒から?

于 2012-12-14T22:06:23.620 に答える