Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Feb 2010 16:46:25 +0200
From:      Mikolaj Golub <to.my.trociny@gmail.com>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: unix socket: race on close?
Message-ID:  <86635ufvpa.fsf@zhuzha.ua1>
In-Reply-To: <alpine.BSF.2.00.1002181157450.59664@fledge.watson.org> (Robert Watson's message of "Thu\, 18 Feb 2010 11\:59\:40 %2B0000 \(GMT\)")
References:  <86ocjn3rue.fsf@zhuzha.ua1> <alpine.BSF.2.00.1002181157450.59664@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 18 Feb 2010 11:59:40 +0000 (GMT) Robert Watson wrote:

> On Thu, 18 Feb 2010, Mikolaj Golub wrote:
>
>> Below is a simple test code with unix sockets: the client does
>> connect()/close() in loop and the server -- accept()/close().
>>
>> Sometimes close() fails with 'Socket is not connected' error:
>
> Hi Mikolaj:
>
> Thanks for this report, and sorry about not spotting your earlier post
> to freebsd-net.  I've been fairly preoccupied the last month and not
> keeping up with the mailing lists.  Could I ask you to file a PR on
> this, and forward me the PR number so I can claim ownership?  This
> should prevent it from getting lost while I catch up.

kern/144061

> In short, your evaluation seems reasonable to me -- have you tried
> tweaking soclose() to ignore ENOTCONN from sodisconnect() to confirm
> this diagnosis fixes all the instances you've been seeing?

I just have done this:

1) add logging the error when sodisconnect() returns error:

--- uipc_socket.c.orig	2010-02-18 14:25:25.000000000 +0200
+++ uipc_socket.c	2010-02-18 14:55:26.000000000 +0200
@@ -120,6 +120,7 @@ __FBSDID("$FreeBSD: src/sys/kern/uipc_so
 #include <sys/proc.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
+#include <sys/syslog.h>
 #include <sys/socketvar.h>
 #include <sys/resourcevar.h>
 #include <net/route.h>
@@ -136,6 +137,7 @@ __FBSDID("$FreeBSD: src/sys/kern/uipc_so
 
 #include <vm/uma.h>
 
+
 #ifdef COMPAT_IA32
 #include <sys/mount.h>
 #include <sys/sysent.h>
@@ -657,7 +659,7 @@ soclose(struct socket *so)
 		if ((so->so_state & SS_ISDISCONNECTING) == 0) {
 			error = sodisconnect(so);
 			if (error)
-				goto drop;
+				log(LOG_INFO, "soclose: sodisconnect error: %d\n", error);
 		}
 		if (so->so_options & SO_LINGER) {
 			if ((so->so_state & SS_ISDISCONNECTING) &&


Then on every error exit of the test application, like this

a.out: parent: close error: 57

I have in the message log:

Feb 18 15:35:32 zhuzha kernel: soclose: sodisconnect error: 57

2) add logging the error when sodisconnect() returns error and ignore the error:

--- uipc_socket.c.orig	2010-02-18 14:25:25.000000000 +0200
+++ uipc_socket.c	2010-02-18 15:41:07.000000000 +0200
@@ -120,6 +120,7 @@ __FBSDID("$FreeBSD: src/sys/kern/uipc_so
 #include <sys/proc.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
+#include <sys/syslog.h>
 #include <sys/socketvar.h>
 #include <sys/resourcevar.h>
 #include <net/route.h>
@@ -136,6 +137,7 @@ __FBSDID("$FreeBSD: src/sys/kern/uipc_so
 
 #include <vm/uma.h>
 
+
 #ifdef COMPAT_IA32
 #include <sys/mount.h>
 #include <sys/sysent.h>
@@ -656,8 +658,11 @@ soclose(struct socket *so)
 	if (so->so_state & SS_ISCONNECTED) {
 		if ((so->so_state & SS_ISDISCONNECTING) == 0) {
 			error = sodisconnect(so);
-			if (error)
-				goto drop;
+			if (error) {
+				log(LOG_INFO, "soclose: sodisconnect error: %d\n", error);
+				if (error == ENOTCONN)
+					error = 0;
+			}
 		}
 		if (so->so_options & SO_LINGER) {
 			if ((so->so_state & SS_ISDISCONNECTING) &&


After this the test application does not exits and I see in the message log:

Feb 18 16:02:37 zhuzha kernel: soclose: sodisconnect error: 57
Feb 18 16:03:31 zhuzha kernel: soclose: sodisconnect error: 57
Feb 18 16:05:49 zhuzha last message repeated 4 times
Feb 18 16:15:50 zhuzha last message repeated 13 times

-- 
Mikolaj Golub



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86635ufvpa.fsf>