]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/daemon.c
Plug mutex/rwlock leaks (destroy them)
[openldap] / servers / slapd / daemon.c
index b3cc805ec24c4fe41f8c92e61515fe7a2a0544ad..a504842ae0266acaac5593d44bbe82429ed7b007 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2009 The OpenLDAP Foundation.
+ * Copyright 1998-2010 The OpenLDAP Foundation.
  * Portions Copyright 2007 by Howard Chu, Symas Corporation.
  * All rights reserved.
  *
@@ -989,13 +989,17 @@ slapd_clr_read( ber_socket_t s, int wake )
 void
 slapd_set_read( ber_socket_t s, int wake )
 {
+       int do_wake = 1;
        ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
 
-       assert( SLAP_SOCK_IS_ACTIVE( s ));
-       if (!SLAP_SOCK_IS_READ( s )) SLAP_SOCK_SET_READ( s );
-
+       if( SLAP_SOCK_IS_ACTIVE( s ) && !SLAP_SOCK_IS_READ( s )) {
+               SLAP_SOCK_SET_READ( s );
+       } else {
+               do_wake = 0;
+       }
        ldap_pvt_thread_mutex_unlock( &slap_daemon.sd_mutex );
-       WAKE_LISTENER(wake);
+       if ( do_wake )
+               WAKE_LISTENER(wake);
 }
 
 time_t
@@ -1620,6 +1624,7 @@ slapd_daemon_init( const char *urls )
                        "daemon: lutil_pair() failed rc=%d\n", rc, 0, 0 );
                return rc;
        }
+       ber_pvt_socket_set_nonblock( wake_sds[1], 1 );
 
        SLAP_SOCK_INIT;
 
@@ -1715,9 +1720,12 @@ close_listeners(
 
        for ( l = 0; slap_listeners[l] != NULL; l++ ) {
                Listener *lr = slap_listeners[l];
+               slap_listeners[l] = NULL;
 
                if ( lr->sl_sd != AC_SOCKET_INVALID ) {
-                       if ( remove ) slapd_remove( lr->sl_sd, NULL, 0, 0, 0 );
+                       int s = lr->sl_sd;
+                       lr->sl_sd = AC_SOCKET_INVALID;
+                       if ( remove ) slapd_remove( s, NULL, 0, 0, 0 );
 
 #ifdef LDAP_PF_LOCAL
                        if ( lr->sl_sa.sa_addr.sa_family == AF_LOCAL ) {
@@ -1725,7 +1733,7 @@ close_listeners(
                        }
 #endif /* LDAP_PF_LOCAL */
 
-                       slapd_close( lr->sl_sd );
+                       slapd_close( s );
                }
 
                if ( lr->sl_url.bv_val ) {
@@ -1737,7 +1745,6 @@ close_listeners(
                }
 
                free( lr );
-               slap_listeners[l] = NULL;
        }
 }
 
@@ -2797,7 +2804,7 @@ connectionless_init( void )
                if ( !c ) {
                        Debug( LDAP_DEBUG_TRACE,
                                "connectionless_init: failed on %s (%d)\n",
-                               lr->sl_url, lr->sl_sd, 0 );
+                               lr->sl_url.bv_val, lr->sl_sd, 0 );
                        return -1;
                }
                lr->sl_is_udp++;