svn commit: samba r3864 - in branches/SAMBA_3_0/source/nmbd: .

jra at samba.org jra at samba.org
Thu Nov 18 22:11:21 GMT 2004


Author: jra
Date: 2004-11-18 22:11:20 +0000 (Thu, 18 Nov 2004)
New Revision: 3864

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=3864

Log:
Fix from Lars M?\195?\188ller <lmuelle at suse.de> for bug #2050.
Make nmbd use maxfd+1 in select also.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/nmbd/nmbd_packets.c


Changeset:
Modified: branches/SAMBA_3_0/source/nmbd/nmbd_packets.c
===================================================================
--- branches/SAMBA_3_0/source/nmbd/nmbd_packets.c	2004-11-18 21:22:30 UTC (rev 3863)
+++ branches/SAMBA_3_0/source/nmbd/nmbd_packets.c	2004-11-18 22:11:20 UTC (rev 3864)
@@ -1635,11 +1635,21 @@
 }
 
 /****************************************************************************
+  Check and if required set the highest fd.
+***************************************************************************/
+
+void check_set_maxfd( int *maxfd, int fd)
+{
+	if ( *maxfd < fd )
+		*maxfd = fd;
+}
+
+/****************************************************************************
   Create an fd_set containing all the sockets in the subnet structures,
   plus the broadcast sockets.
 ***************************************************************************/
 
-static BOOL create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number)
+static BOOL create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number, int *maxfd)
 {
 	int *sock_array = NULL;
 	struct subnet_record *subrec = NULL;
@@ -1672,21 +1682,25 @@
 	/* Add in the broadcast socket on 137. */
 	FD_SET(ClientNMB,pset);
 	sock_array[num++] = ClientNMB;
+	check_set_maxfd( maxfd, ClientNMB);
 
 	/* Add in the 137 sockets on all the interfaces. */
 	for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
 		FD_SET(subrec->nmb_sock,pset);
 		sock_array[num++] = subrec->nmb_sock;
+		check_set_maxfd( maxfd, subrec->nmb_sock);
 	}
 
 	/* Add in the broadcast socket on 138. */
 	FD_SET(ClientDGRAM,pset);
 	sock_array[num++] = ClientDGRAM;
+	check_set_maxfd( maxfd, ClientDGRAM);
 
 	/* Add in the 138 sockets on all the interfaces. */
 	for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
 		FD_SET(subrec->dgram_sock,pset);
 		sock_array[num++] = subrec->dgram_sock;
+		check_set_maxfd( maxfd, subrec->dgram_sock);
 	}
 
 	*listen_number = (count*2) + 2;
@@ -1711,6 +1725,7 @@
 	static int listen_number = 0;
 	static int *sock_array = NULL;
 	int i;
+	int maxfd = 0;
 
 	fd_set fds;
 	int selrtn;
@@ -1720,7 +1735,7 @@
 #endif
 
 	if(listen_set == NULL || rescan_listen_set) {
-		if(create_listen_fdset(&listen_set, &sock_array, &listen_number)) {
+		if(create_listen_fdset(&listen_set, &sock_array, &listen_number, &maxfd)) {
 			DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n"));
 			return True;
 		}
@@ -1733,6 +1748,7 @@
 	dns_fd = asyncdns_fd();
 	if (dns_fd != -1) {
 		FD_SET(dns_fd, &fds);
+		check_set_maxfd( &maxfd, dns_fd);
 	}
 #endif
 
@@ -1750,7 +1766,7 @@
 
 	BlockSignals(False, SIGTERM);
 
-	selrtn = sys_select(FD_SETSIZE,&fds,NULL,NULL,&timeout);
+	selrtn = sys_select(maxfd+1,&fds,NULL,NULL,&timeout);
 
 	/* We can only take signals when we are in the select - block them again here. */
 



More information about the samba-cvs mailing list