lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Thu,  8 Nov 2012 07:51:48 -0800
From:	Andi Kleen <andi@...stfloor.org>
To:	davem@...emloft.net
Cc:	netdev@...r.kernel.org, Andi Kleen <ak@...ux.intel.com>
Subject: [PATCH] ipv4: Handle very small SO_SNDTIMEOs

From: Andi Kleen <ak@...ux.intel.com>

When the SO_SNDTIMEO timeout is short enough it may round down to zero
jiffies.   This causes unexpected behaviour because the socket
essentially becomes always non blocking.

Round up the timeout to at least two jiffies, so that
we guarantee waiting for at least some time. With one jiffie
we could potentially still wait zero time because we might
be just at the edge of the jiffie, and if it flips over
in the middle of the check it could be still zero.

This has been observed in a real application.

Signed-off-by: Andi Kleen <ak@...ux.intel.com>
---
 net/core/sock.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/net/core/sock.c b/net/core/sock.c
index a6000fb..93c0060 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -362,8 +362,15 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
 	*timeo_p = MAX_SCHEDULE_TIMEOUT;
 	if (tv.tv_sec == 0 && tv.tv_usec == 0)
 		return 0;
-	if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1))
+	if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1)) {
 		*timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ);
+		/* Do at least two jiffies to ensure we wait at all.
+		 * Otherwise we may be on the edge of the next jiffie already,
+		 * and then essentially non block.
+		 */
+		if ((unsigned long)*timeo_p < 2)
+			*timeo_p = 2;
+	}
 	return 0;
 }
 
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ