]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#276: make copy of errno before it gets slammed.
authorKurt Zeilenga <kurt@openldap.org>
Wed, 1 Sep 1999 00:33:54 +0000 (00:33 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Wed, 1 Sep 1999 00:33:54 +0000 (00:33 +0000)
CHANGES
servers/slapd/back-ldbm/dbcache.c
servers/slapd/connection.c
servers/slapd/daemon.c
servers/slapd/result.c

diff --git a/CHANGES b/CHANGES
index a04aee3d1b81f7d9b8309fd1f3e81b9e91a83b2c..956a002767a5fb4f0aee3b6134f693dfc06fff64 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,7 @@ Changes included in OpenLDAP 1.2 Release Engineering
        Fixed ldapsearch (%s) bug (ITS#274)
        Fixed slapd (cn=*=+=*) regex bug (ITS#272)
        Fixed -lldap (cn=*\**) filter handling (ITS#247 ITS#275)
+       Fixed slapd errno handling
        Build environment
                Disable config.cache to ensure consistent detection
        Documentation
index 5e3549ff34f0ca0e8b722f1caa582d5bb6978cde..5589fc2153fc13d06e0cb6f2aaa20636aa664e2e 100644 (file)
@@ -93,10 +93,11 @@ ldbm_cache_open(
 
        if ( (li->li_dbcache[i].dbc_db = ldbm_open( buf, flags, li->li_mode,
            li->li_dbcachesize )) == NULL ) {
+               int err = errno;
                Debug( LDAP_DEBUG_TRACE,
                    "<= ldbm_cache_open NULL \"%s\" errno %d reason \"%s\")\n",
-                   buf, errno, errno > -1 && errno < sys_nerr ?
-                   sys_errlist[errno] : "unknown" );
+                   buf, err, err > -1 && err < sys_nerr ?
+                   sys_errlist[err] : "unknown" );
                ldap_pvt_thread_mutex_unlock( &li->li_dbcache_mutex );
                return( NULL );
        }
index 6d13fb39e3be8ba22c897e5e6e3fe84cb517f016..7d20080c27583e4034f9f7cfd25ac2ec8f8af387 100644 (file)
@@ -133,15 +133,16 @@ connection_activity(
        errno = 0;
        if ( (tag = ber_get_next( &conn->c_sb, &len, conn->c_currentber ))
            != LDAP_TAG_MESSAGE ) {
+               int err = errno;
                Debug( LDAP_DEBUG_TRACE,
                    "ber_get_next on fd %d failed errno %d (%s)\n",
-                   conn->c_sb.sb_sd, errno, errno > -1 && errno < sys_nerr ?
-                   sys_errlist[errno] : "unknown" );
+                   conn->c_sb.sb_sd, err, err > -1 && err < sys_nerr ?
+                   sys_errlist[err] : "unknown" );
                Debug( LDAP_DEBUG_TRACE, "*** got %ld of %lu so far\n",
                    (long)(conn->c_currentber->ber_rwptr - conn->c_currentber->ber_buf),
                    conn->c_currentber->ber_len, 0 );
 
-               if ( errno != EWOULDBLOCK && errno != EAGAIN ) {
+               if ( err != EWOULDBLOCK && err != EAGAIN ) {
                        /* log, close and send error */
                        ber_free( conn->c_currentber, 1 );
                        conn->c_currentber = NULL;
index eec95b79a9fc044022c2e7659618d2f1fefd102a..14e309e589ded7081de6179d237fc936580bc760 100644 (file)
@@ -95,8 +95,9 @@ slapd_daemon(
        }
 
        if ( (tcps = socket( AF_INET, SOCK_STREAM, 0 )) == -1 ) {
-               Debug( LDAP_DEBUG_ANY, "socket() failed errno %d (%s)", errno,
-                   errno > -1 && errno < sys_nerr ? sys_errlist[errno] :
+               int err = errno;
+               Debug( LDAP_DEBUG_ANY, "socket() failed errno %d (%s)", err,
+                   err > -1 && err < sys_nerr ? sys_errlist[err] :
                    "unknown", 0 );
                exit( 1 );
        }
@@ -104,8 +105,9 @@ slapd_daemon(
        i = 1;
        if ( setsockopt( tcps, SOL_SOCKET, SO_REUSEADDR, (char *) &i,
            sizeof(i) ) == -1 ) {
+               int err = errno;
                Debug( LDAP_DEBUG_ANY, "setsockopt(reuse) failed errno %d (%s)",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno] :
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err] :
                    "unknown", 0 );
        }
 
@@ -113,8 +115,9 @@ slapd_daemon(
        i = 1;
        if ( setsockopt( tcps, SOL_SOCKET, SO_KEEPALIVE, (char *) &i,
            sizeof(i) ) == -1 ) {
+               int err = errno;
                Debug( LDAP_DEBUG_ANY, "setsockopt(keepalive) failed errno %d (%s)",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno] :
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err] :
                    "unknown", 0 );
        }
 #endif
@@ -124,15 +127,17 @@ slapd_daemon(
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons( (int)port );
        if ( bind( tcps, (struct sockaddr *) &addr, sizeof(addr) ) == -1 ) {
+               int err = errno;
                Debug( LDAP_DEBUG_ANY, "bind() failed errno %d (%s)\n",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno] :
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err] :
                    "unknown", 0 );
                exit( 1 );
        }
 
        if ( listen( tcps, 5 ) == -1 ) {
+               int err = errno;
                Debug( LDAP_DEBUG_ANY, "listen() failed errno %d (%s)",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno] :
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err] :
                    "unknown", 0 );
                exit( 1 );
        }
@@ -201,12 +206,13 @@ slapd_daemon(
                ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
 
                switch ( i = select( dtblsize, &readfds, &writefds, 0, tvp ) ) {
-               case -1:        /* failure - try again */
+               case -1:        { /* failure - try again */
+                       int err = errno;
                        Debug( LDAP_DEBUG_CONNS,
                            "select failed errno %d (%s)\n",
-                           errno, errno > -1 && errno < sys_nerr ?
-                           sys_errlist[errno] : "unknown", 0 );
-                       continue;
+                           err, err > -1 && err < sys_nerr ?
+                           sys_errlist[err] : "unknown", 0 );
+                       continue;
 
                case 0:         /* timeout - let threads run */
                        Debug( LDAP_DEBUG_CONNS, "select timeout - yielding\n",
@@ -227,11 +233,13 @@ slapd_daemon(
                if ( FD_ISSET( tcps, &readfds ) ) {
                        len = sizeof(from);
                        if ( (ns = accept( tcps, (struct sockaddr *) &from,
-                           &len )) == -1 ) {
+                           &len )) == -1 )
+                       {
+                               int err = errno;
                                Debug( LDAP_DEBUG_ANY,
-                                   "accept() failed errno %d (%s)", errno,
-                                   errno > -1 && errno < sys_nerr ?
-                                   sys_errlist[errno] : "unknown", 0 );
+                                   "accept() failed errno %d (%s)", err,
+                                   err > -1 && err < sys_nerr ?
+                                   sys_errlist[err] : "unknown", 0 );
                                ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
                                continue;
                        }
index 19d162ed53069f2367fbd57b512facd5a43ace37..f7320bdf8be29a9c2909b82df40bc02984e36c83 100644 (file)
@@ -91,6 +91,7 @@ send_ldap_result2(
        ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        while ( conn->c_connid == op->o_connid && ber_flush( &conn->c_sb, ber,
            0 ) != 0 ) {
+               int err = errno;
                ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
                /*
                 * we got an error.  if it's ewouldblock, we need to
@@ -99,10 +100,10 @@ send_ldap_result2(
                 */
 
                Debug( LDAP_DEBUG_CONNS, "ber_flush failed errno %d msg (%s)\n",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno]
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err]
                    : "unknown", 0 );
 
-               if ( errno != EWOULDBLOCK && errno != EAGAIN ) {
+               if ( err != EWOULDBLOCK && err != EAGAIN ) {
                        close_connection( conn, op->o_connid, op->o_opid );
 
                        ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
@@ -332,6 +333,7 @@ send_search_entry(
        ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        while ( conn->c_connid == op->o_connid && ber_flush( &conn->c_sb, ber,
            0 ) != 0 ) {
+               int err = errno;
                ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
                /*
                 * we got an error.  if it's ewouldblock, we need to
@@ -340,10 +342,10 @@ send_search_entry(
                 */
 
                Debug( LDAP_DEBUG_CONNS, "ber_flush failed errno %d msg (%s)\n",
-                   errno, errno > -1 && errno < sys_nerr ? sys_errlist[errno]
+                   err, err > -1 && err < sys_nerr ? sys_errlist[err]
                    : "unknown", 0 );
 
-               if ( errno != EWOULDBLOCK && errno != EAGAIN ) {
+               if ( err != EWOULDBLOCK && err != EAGAIN ) {
                        close_connection( conn, op->o_connid, op->o_opid );
 
                        ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
@@ -459,10 +461,12 @@ close_connection( Connection *conn, int opconnid, int opid )
 {
        ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        if ( conn->c_sb.sb_sd != -1 && conn->c_connid == opconnid ) {
+               int err;
+               close( conn->c_sb.sb_sd );
+               err = errno;
                Statslog( LDAP_DEBUG_STATS,
                    "conn=%d op=%d fd=%d closed errno=%d\n", conn->c_connid,
-                   opid, conn->c_sb.sb_sd, errno, 0 );
-               close( conn->c_sb.sb_sd );
+                   opid, conn->c_sb.sb_sd, err, 0 );
                conn->c_sb.sb_sd = -1;
                conn->c_version = 0;
        }