diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c
index b05cf793e0e17d1d120b4ba19ec6a21558c2230f..2d3e8f9d6b2b767272a561c4a5a3876344793768 100644
--- a/servers/slapd/daemon.c
+++ b/servers/slapd/daemon.c
@@ -295,6 +295,8 @@ slapd_daemon_task(
 	while ( !slapd_shutdown ) {
 		unsigned int i;
 		int ns, nfds;
+		int ebadf = 0;
+#define SLAPD_EBADF_LIMIT 10
 
 		fd_set			readfds;
 		fd_set			writefds;
@@ -360,7 +362,11 @@ slapd_daemon_task(
 		case -1: {	/* failure - try again */
 				int err = errno;
 
-				if( err != EINTR || err != EBADF) {
+				if( err == EBADF && ++ebadf < SLAPD_EBADF_LIMIT) {
+					continue;
+				}
+
+				if( err != EINTR ) {
 					Debug( LDAP_DEBUG_CONNS,
 						"daemon: select failed (%d): %s\n",
 						err,
@@ -374,12 +380,14 @@ slapd_daemon_task(
 			continue;
 
 		case 0:		/* timeout - let threads run */
+			ebadf = 0;
 			Debug( LDAP_DEBUG_CONNS, "daemon: select timeout - yielding\n",
 			    0, 0, 0 );
 	     	ldap_pvt_thread_yield();
 			continue;
 
 		default:	/* something happened - deal with it */
+			ebadf = 0;
 			Debug( LDAP_DEBUG_CONNS, "daemon: activity on %d descriptors\n",
 				ns, 0, 0 );
 			/* FALL THRU */