Author: jhb
Date: Thu Feb 17 17:03:56 2011
New Revision: 218777
URL: http://svn.freebsd.org/changeset/base/218777

Log:
  Save a copy of errno before invoking syslog() if accept() or select() fail.
  syslog() can trash the errno value causing nfsd to exit for non-fatal
  errors like ECONNABORTED from accept().
  
  MFC after:    1 week

Modified:
  head/usr.sbin/nfsd/nfsd.c

Modified: head/usr.sbin/nfsd/nfsd.c
==============================================================================
--- head/usr.sbin/nfsd/nfsd.c   Thu Feb 17 16:33:41 2011        (r218776)
+++ head/usr.sbin/nfsd/nfsd.c   Thu Feb 17 17:03:56 2011        (r218777)
@@ -134,7 +134,7 @@ main(int argc, char **argv)
        socklen_t len;
        int on = 1, unregister, reregister, sock;
        int tcp6sock, ip6flag, tcpflag, tcpsock;
-       int udpflag, ecode, s, srvcnt;
+       int udpflag, ecode, error, s, srvcnt;
        int bindhostc, bindanyflag, rpcbreg, rpcbregcnt;
        int stablefd, nfssvc_addsock;
        char **bindhost = NULL;
@@ -738,8 +738,9 @@ main(int argc, char **argv)
                if (connect_type_cnt > 1) {
                        if (select(maxsock + 1,
                            &ready, NULL, NULL, NULL) < 1) {
+                               error = errno;
                                syslog(LOG_ERR, "select failed: %m");
-                               if (errno == EINTR)
+                               if (error == EINTR)
                                        continue;
                                nfsd_exit(1);
                        }
@@ -750,9 +751,10 @@ main(int argc, char **argv)
                                        len = sizeof(inetpeer);
                                        if ((msgsock = accept(tcpsock,
                                            (struct sockaddr *)&inetpeer, 
&len)) < 0) {
+                                               error = errno;
                                                syslog(LOG_ERR, "accept failed: 
%m");
-                                               if (errno == ECONNABORTED ||
-                                                   errno == EINTR)
+                                               if (error == ECONNABORTED ||
+                                                   error == EINTR)
                                                        continue;
                                                nfsd_exit(1);
                                        }
@@ -772,10 +774,11 @@ main(int argc, char **argv)
                                        if ((msgsock = accept(tcpsock,
                                            (struct sockaddr *)&inet6peer,
                                            &len)) < 0) {
+                                               error = errno;
                                                syslog(LOG_ERR,
                                                     "accept failed: %m");
-                                               if (errno == ECONNABORTED ||
-                                                   errno == EINTR)
+                                               if (error == ECONNABORTED ||
+                                                   error == EINTR)
                                                        continue;
                                                nfsd_exit(1);
                                        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to