# Force socket fds to close on exec when used in conjunction with pseudo
# Patch origin: Wind River

---
 nfsd.c    |    8 ++++++++
 rpcmisc.c |    9 +++++++++
 ugidd.c   |    8 ++++++++
 3 files changed, 25 insertions(+)

--- a/nfsd.c
+++ b/nfsd.c
@@ -630,6 +630,14 @@ nfsd_nfsproc_create_2(createargs *argp, 
 			if (S_ISSOCK(argp->attributes.mode)) {
 			  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
 			          return(nfs_errno());
+			  /* if there is a pseudo exec mark the socket to be
+			   * closed automatically
+			   */
+			  {
+				  long f_flags;
+				  f_flags = fcntl(s, F_GETFD);
+				  f_flags = fcntl(s, F_SETFD, f_flags | FD_CLOEXEC);
+			  }
 			  sa.sun_family = AF_UNIX;
 			  strncpy(sa.sun_path, pathbuf, sizeof(sa.sun_path));
 			  sa.sun_path[sizeof(sa.sun_path)-1] = '\0';
--- a/rpcmisc.c
+++ b/rpcmisc.c
@@ -197,6 +197,15 @@ makesock(int port, int proto, int socksz
 		Dprintf(L_FATAL, "Could not make a %s socket: %s\n",
 					prot_name, strerror(errno));
 
+	/* if there is a pseudo exec mark the socket to be
+	 * closed automatically
+	 */
+	{
+		long f_flags;
+		f_flags = fcntl(s, F_GETFD);
+		f_flags = fcntl(s, F_SETFD, f_flags | FD_CLOEXEC);
+	}
+	fcntl(s, FD_CLOEXEC, 1);
 	memset((char *) &sin, 0, sizeof(sin));
 	sin.sin_family = AF_INET;
 	sin.sin_addr.s_addr = INADDR_ANY;
--- a/ugidd.c
+++ b/ugidd.c
@@ -195,6 +195,14 @@ authenticate_1_svc(argp, rqstp)
 	destaddr.sin_port = htons(*argp);
 	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
 		goto bad;
+	/* if there is a pseudo exec mark the socket to be
+	 * closed automatically
+	 */
+	{
+		long f_flags;
+		f_flags = fcntl(s, F_GETFD);
+		f_flags = fcntl(s, F_SETFD, f_flags | FD_CLOEXEC);
+	}
 	setsockopt(s, SOL_SOCKET, SO_LINGER, 0, 0);
 	bzero((char *) &sendaddr, sizeof sendaddr);
 	/* find a reserved port */
