Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763450AbXEXEmA (ORCPT ); Thu, 24 May 2007 00:42:00 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1759862AbXEXElu (ORCPT ); Thu, 24 May 2007 00:41:50 -0400 Received: from gw1.cosmosbay.com ([86.65.150.130]:45264 "EHLO gw1.cosmosbay.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759246AbXEXElt (ORCPT ); Thu, 24 May 2007 00:41:49 -0400 Message-ID: <46551635.30809@cosmosbay.com> Date: Thu, 24 May 2007 06:36:05 +0200 From: Eric Dumazet User-Agent: Thunderbird 1.5.0.10 (Windows/20070221) MIME-Version: 1.0 To: Vasily Averin CC: "David S. Miller" , netdev@vger.kernel.org, Andrew Morton , Linux Kernel Mailing List , devel@openvz.org Subject: Re: [PATCH netdev] "wrong timeout value" in sk_wait_data() References: <465512EB.4000808@sw.ru> In-Reply-To: <465512EB.4000808@sw.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-1.6 (gw1.cosmosbay.com [86.65.150.130]); Thu, 24 May 2007 06:36:11 +0200 (CEST) Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1875 Lines: 53 Vasily Averin a écrit : > 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 > > diff --git a/net/core/sock.c b/net/core/sock.c > index 22183c2..27d7a46 100644 > --- a/net/core/sock.c > +++ b/net/core/sock.c > @@ -206,7 +206,19 @@ static int sock_set_timeout(long *timeo_p, char __user > *optval, int optlen) > return -EINVAL; > if (copy_from_user(&tv, optval, sizeof(tv))) > return -EFAULT; > - > + if (tv.tv_usec < 0 || tv.tv_usec >= 1000000) > + return -EDOM; Please use USEC_PER_SEC instead of 1000000 > + > + if (tv.tv_sec < 0) { > + static int warned = 0; > + *timeo_p = 0; > + if (warned < 10 && net_ratelimit()) > + warned++; > + printk(KERN_INFO "sock_set_timeout: `%s' (pid %d) " > + "tries to set negative timeout\n", > + current->comm, current->pid); > + return 0; > + } > *timeo_p = MAX_SCHEDULE_TIMEOUT; > if (tv.tv_sec == 0 && tv.tv_usec == 0) > return 0; > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/