Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/nfsd PR/42486: Ed Ravin nfsd sometimes exits premat...



details:   https://anonhg.NetBSD.org/src/rev/826619a921ce
branches:  trunk
changeset: 750225:826619a921ce
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Dec 21 05:06:55 2009 +0000

description:
PR/42486: Ed Ravin nfsd sometimes exits prematurely during port-scan fix
from freebsd bin 61084 applied (preserving errno properly). The accept
code should be merged.

diffstat:

 usr.sbin/nfsd/nfsd.c |  18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diffs (71 lines):

diff -r 0b8bef42a24f -r 826619a921ce usr.sbin/nfsd/nfsd.c
--- a/usr.sbin/nfsd/nfsd.c      Sun Dec 20 23:23:46 2009 +0000
+++ b/usr.sbin/nfsd/nfsd.c      Mon Dec 21 05:06:55 2009 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nfsd.c,v 1.56 2008/11/21 07:48:35 pooka Exp $  */
+/*     $NetBSD: nfsd.c,v 1.57 2009/12/21 05:06:55 christos Exp $       */
 
 /*
  * Copyright (c) 1989, 1993, 1994
@@ -42,7 +42,7 @@
 #if 0
 static char sccsid[] = "@(#)nfsd.c     8.9 (Berkeley) 3/29/95";
 #else
-__RCSID("$NetBSD: nfsd.c,v 1.56 2008/11/21 07:48:35 pooka Exp $");
+__RCSID("$NetBSD: nfsd.c,v 1.57 2009/12/21 05:06:55 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -147,7 +147,7 @@
        struct sockaddr_in6 inet6peer;
        struct pollfd set[4];
        socklen_t len;
-       int ch, cltpflag, connect_type_cnt, i, maxsock, msgsock;
+       int ch, cltpflag, connect_type_cnt, i, maxsock, msgsock, serrno;
        int nfsdcnt, on = 1, reregister, sock, tcpflag, tcpsock;
        int tcp6sock, ip6flag;
        int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag, ecode, s;
@@ -486,7 +486,10 @@
                        len = sizeof(inetpeer);
                        if ((msgsock = accept(tcpsock,
                            (struct sockaddr *)&inetpeer, &len)) < 0) {
+                               serrno = errno;
                                syslog(LOG_ERR, "accept failed: %m");
+                               if (serrno == EINTR || serrno == ECONNABORTED)
+                                       continue;
                                exit(1);
                        }
                        memset(inetpeer.sin_zero, 0, sizeof(inetpeer.sin_zero));
@@ -505,7 +508,10 @@
                        len = sizeof(inet6peer);
                        if ((msgsock = accept(tcp6sock,
                            (struct sockaddr *)&inet6peer, &len)) < 0) {
+                               serrno = errno;
                                syslog(LOG_ERR, "accept failed: %m");
+                               if (serrno == EINTR || serrno == ECONNABORTED)
+                                       continue;
                                exit(1);
                        }
                        if (setsockopt(msgsock, SOL_SOCKET,
@@ -524,7 +530,10 @@
                        len = sizeof(isopeer);
                        if ((msgsock = accept(tp4sock,
                            (struct sockaddr *)&isopeer, &len)) < 0) {
+                               serrno = errno;
                                syslog(LOG_ERR, "accept failed: %m");
+                               if (serrno == EINTR || serrno == ECONNABORTED)
+                                       continue;
                                exit(1);
                        }
                        if (setsockopt(msgsock, SOL_SOCKET,
@@ -542,7 +551,10 @@
                        len = sizeof(inetpeer);
                        if ((msgsock = accept(tpipsock,
                            (struct sockaddr *)&inetpeer, &len)) < 0) {
+                               serrno = errno;
                                syslog(LOG_ERR, "accept failed: %m");
+                               if (serrno == EINTR || serrno == ECONNABORTED)
+                                       continue;
                                exit(1);
                        }
                        if (setsockopt(msgsock, SOL_SOCKET,



Home | Main Index | Thread Index | Old Index