]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/daemon.c
ITS#5489
[openldap] / servers / slapd / daemon.c
index d9ea1fd04d935997cff9b807c36f4e6785c2aca4..d893407a6429f1a8b915fc4d04740696097d5698 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2008 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -227,7 +227,8 @@ static struct slap_daemon {
        (int *)(ptr) <= &slap_daemon.sd_index[dtblsize]) ? 0 : 1 )
 
 # define SLAP_EPOLL_EV_PTRFD(ptr)              (SLAP_EPOLL_EV_LISTENER(ptr) ? \
-       ((Listener *)ptr)->sl_sd : (int *)(ptr) - slap_daemon.sd_index)
+       ((Listener *)ptr)->sl_sd : \
+       (ber_socket_t) ((int *)(ptr) - slap_daemon.sd_index))
 
 # define SLAP_SOCK_DEL(s)              do { \
        int fd, rc, index = SLAP_EPOLL_SOCK_IX((s)); \
@@ -494,6 +495,7 @@ static struct slap_daemon {
 
 # define SLAP_SOCK_INIT                        do { \
        SLAP_SELECT_CHK_SETSIZE; \
+       FD_ZERO(&slap_daemon.sd_actives); \
        FD_ZERO(&slap_daemon.sd_readers); \
        FD_ZERO(&slap_daemon.sd_writers); \
 } while (0)
@@ -808,9 +810,9 @@ slapd_clr_write( ber_socket_t s, int wake )
 {
        ldap_pvt_thread_mutex_lock( &slap_daemon.sd_mutex );
 
-       assert( SLAP_SOCK_IS_ACTIVE( s ));
-
        if ( SLAP_SOCK_IS_WRITE( s )) {
+               assert( SLAP_SOCK_IS_ACTIVE( s ));
+
                SLAP_SOCK_CLR_WRITE( s );
                slap_daemon.sd_nwriters--;
        }
@@ -1581,7 +1583,7 @@ slap_listener(
        Sockaddr                from;
 
        ber_socket_t s;
-       socklen_t len = sizeof(from);
+       ber_socklen_t len = sizeof(from);
        long id;
        slap_ssf_t ssf = 0;
        struct berval authid = BER_BVNULL;
@@ -1600,7 +1602,7 @@ slap_listener(
 #endif /* LDAP_PF_LOCAL */
 
        Debug( LDAP_DEBUG_TRACE,
-               ">>> slap_listener(%s)",
+               ">>> slap_listener(%s)\n",
                sl->sl_url.bv_val, 0, 0 );
 
        peername[0] = '\0';
@@ -2123,8 +2125,14 @@ slapd_daemon_task(
                ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
 
                if ( rtask && cat.tv_sec ) {
-                       time_t diff = difftime( cat.tv_sec, now );
-                       if ( diff == 0 ) diff = tdelta;
+                       /* NOTE: diff __should__ always be >= 0,
+                        * AFAI understand; however (ITS#4872),
+                        * time_t might be unsigned in some systems,
+                        * while difftime() returns a double */
+                       double diff = difftime( cat.tv_sec, now );
+                       if ( diff <= 0 ) {
+                               diff = tdelta;
+                       }
                        if ( tvp == NULL || diff < tv.tv_sec ) {
                                tv.tv_sec = diff;
                                tv.tv_usec = 0;