From 4a505a2860c08c8223b44507e212a4ce5e433bea Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Nov 2004 22:11:20 +0000 Subject: r3864: Fix from Lars Müller for bug #2050. Make nmbd use maxfd+1 in select also. Jeremy. (This used to be commit e3ca22b80dc1c22f0e5c829d11724c79e317641f) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source3/nmbd/nmbd_packets.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'source3/nmbd') diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index 96de4911dc..9dd2d05e14 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -1634,12 +1634,22 @@ on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip), subrec->subnet_ } /* end for subnet */ } +/**************************************************************************** + 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 @@ only use %d.\n", (count*2) + 2, FD_SETSIZE)); /* 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 @@ BOOL listen_for_packets(BOOL run_election) static int listen_number = 0; static int *sock_array = NULL; int i; + int maxfd = 0; fd_set fds; int selrtn; @@ -1720,7 +1735,7 @@ BOOL listen_for_packets(BOOL run_election) #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 @@ BOOL listen_for_packets(BOOL run_election) dns_fd = asyncdns_fd(); if (dns_fd != -1) { FD_SET(dns_fd, &fds); + check_set_maxfd( &maxfd, dns_fd); } #endif @@ -1750,7 +1766,7 @@ BOOL listen_for_packets(BOOL run_election) 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. */ -- cgit