Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Mar 2013 22:24:08 +0100
From:      Jilles Tjoelker <jilles@stack.nl>
To:        "Hartmann, O." <ohartman@zedat.fu-berlin.de>
Cc:        FreeBSD Current <freebsd-current@freebsd.org>, Dimitry Andric <dim@FreeBSD.org>
Subject:   Re: r247839: broken pipe - for top, sudo and ports
Message-ID:  <20130306212408.GA15814@stack.nl>
In-Reply-To: <51364E8D.5020608@zedat.fu-berlin.de>
References:  <5135B7E1.3050002@zedat.fu-berlin.de> <5135BBD9.9090009@FreeBSD.org> <51364914.2010104@zedat.fu-berlin.de> <51364E8D.5020608@zedat.fu-berlin.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 05, 2013 at 08:59:09PM +0100, Hartmann, O. wrote:
> A "truss top" reveals this, is this of help?

> [...]
> stat("/etc/nsswitch.conf",{ mode=-rw-r--r--
> ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0)
> stat("/etc/nsswitch.conf",{ mode=-rw-r--r--
> ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0)
> stat("/etc/nsswitch.conf",{ mode=-rw-r--r--
> ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0)
> stat("/etc/nsswitch.conf",{ mode=-rw-r--r--
> ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0)
> stat("/etc/nsswitch.conf",{ mode=-rw-r--r--
> ,inode=162310,size=1007,blksize=32768 }) = 0 (0x0)
> socket(PF_LOCAL,SOCK_STREAM,0)                   = 4 (0x4)
> connect(4,{ AF_UNIX "/var/run/nscd" },15)        = 0 (0x0)
> fcntl(4,F_SETFL,O_NONBLOCK)                      = 0 (0x0)
> kqueue(0x80183b000,0x80122fc58,0x10,0x80062b308,0x80183b010,0x2) = 5 (0x5)
> kevent(5,{0x4,EVFILT_WRITE,EV_ADD,0,0x0,0x0},1,0x0,0,0x0) = 0 (0x0)
> kqueue(0x5,0x7fffffffd2e0,0x1,0x0,0x0,0x0)       = 6 (0x6)
> kevent(6,{0x4,EVFILT_READ,EV_ADD,0,0x0,0x0},1,0x0,0,0x0) = 0 (0x0)
> kevent(5,{0x4,EVFILT_WRITE,EV_ADD,1,0x4,0x0},1,0x0,0,0x0) = 0 (0x0)
> kevent(5,0x0,0,{0x4,EVFILT_WRITE,EV_EOF,0,0x2000,0x0},1,0x0) = 1 (0x1)
> sendmsg(0x4,0x7fffffffd290,0x0,0x1,0x1,0x0)      ERR#32 'Broken pipe'
> SIGNAL 13 (SIGPIPE)
> process exit, rval = 0

Apparently there is a bug that causes nscd to close the connection
immediately but even then it is wrong that this terminates the calling
program with SIGPIPE.

The below patch prevents the SIGPIPE but cannot revive the connection to
nscd. This may cause numeric UIDs in top or increase the load on the
directory server. It is compile tested only.

Index: lib/libc/net/nscachedcli.c
===================================================================
--- lib/libc/net/nscachedcli.c	(revision 247710)
+++ lib/libc/net/nscachedcli.c	(working copy)
@@ -75,9 +75,9 @@
 		nevents = _kevent(connection->write_queue, NULL, 0, &eventlist,
 		    1, &timeout);
 		if ((nevents == 1) && (eventlist.filter == EVFILT_WRITE)) {
-			s_result = _write(connection->sockfd, data + result,
+			s_result = send(connection->sockfd, data + result,
 			    eventlist.data < data_size - result ?
-			    eventlist.data : data_size - result);
+			    eventlist.data : data_size - result, MSG_NOSIGNAL);
 			if (s_result == -1)
 				return (-1);
 			else
@@ -175,8 +175,8 @@
 	nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1,
 	    NULL);
 	if (nevents == 1 && eventlist.filter == EVFILT_WRITE) {
-		result = (_sendmsg(connection->sockfd, &cred_hdr, 0) == -1) ?
-		    -1 : 0;
+		result = (_sendmsg(connection->sockfd, &cred_hdr,
+		    MSG_NOSIGNAL) == -1) ?  -1 : 0;
 		EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD,
 		    0, 0, NULL);
 		_kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL);

-- 
Jilles Tjoelker



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