libc: Avoid SIGPIPE when nscd closes the connection unexpectedly.

It is almost always a bug if nscd closes the connection unexpectedly but
programs should not be killed with SIGPIPE for it.

Reviewed by:	bushman
Tested by:	Jan Beich
MFC after:	1 week
This commit is contained in:
Jilles Tjoelker 2013-03-13 18:38:18 +00:00
parent 5fc3f0cad0
commit 37aafc3318

View File

@ -75,9 +75,10 @@ safe_write(struct cached_connection_ *connection, const void *data,
nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, nevents = _kevent(connection->write_queue, NULL, 0, &eventlist,
1, &timeout); 1, &timeout);
if ((nevents == 1) && (eventlist.filter == EVFILT_WRITE)) { if ((nevents == 1) && (eventlist.filter == EVFILT_WRITE)) {
s_result = _write(connection->sockfd, data + result, s_result = _sendto(connection->sockfd, data + result,
eventlist.data < data_size - result ? eventlist.data < data_size - result ?
eventlist.data : data_size - result); eventlist.data : data_size - result, MSG_NOSIGNAL,
NULL, 0);
if (s_result == -1) if (s_result == -1)
return (-1); return (-1);
else else
@ -175,8 +176,8 @@ send_credentials(struct cached_connection_ *connection, int type)
nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1, nevents = _kevent(connection->write_queue, NULL, 0, &eventlist, 1,
NULL); NULL);
if (nevents == 1 && eventlist.filter == EVFILT_WRITE) { if (nevents == 1 && eventlist.filter == EVFILT_WRITE) {
result = (_sendmsg(connection->sockfd, &cred_hdr, 0) == -1) ? result = (_sendmsg(connection->sockfd, &cred_hdr,
-1 : 0; MSG_NOSIGNAL) == -1) ? -1 : 0;
EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD, EV_SET(&eventlist, connection->sockfd, EVFILT_WRITE, EV_ADD,
0, 0, NULL); 0, 0, NULL);
_kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL); _kevent(connection->write_queue, &eventlist, 1, NULL, 0, NULL);