X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=d893407a6429f1a8b915fc4d04740696097d5698;hb=8696d47b7468769e8c090d4807dce0ba671be8ab;hp=d9ea1fd04d935997cff9b807c36f4e6785c2aca4;hpb=75a983f546b39e9ec690f044b8e3ea58af1821c9;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index d9ea1fd04d..d893407a64 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * 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;