]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
Import cn=config crash fix from -devel.
[openldap] / servers / slapd / result.c
index a18ba20a8611ba266c2c212f56e5310cb54e294f..15a28162f3ccf9d7ebc90855b8aa1625e9cb4d82 100644 (file)
@@ -83,14 +83,14 @@ send_ldap_result2(
        }
 
        /* write only one pdu at a time - wait til it's our turn */
-       pthread_mutex_lock( &conn->c_pdumutex );
+       ldap_pvt_thread_mutex_lock( &conn->c_pdumutex );
 
        /* write the pdu */
        bytes = ber->ber_ptr - ber->ber_buf;
-       pthread_mutex_lock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        while ( conn->c_connid == op->o_connid && ber_flush( &conn->c_sb, ber,
            1 ) != 0 ) {
-               pthread_mutex_unlock( &new_conn_mutex );
+               ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
                /*
                 * we got an error.  if it's ewouldblock, we need to
                 * wait on the socket being writable.  otherwise, figure
@@ -104,29 +104,33 @@ send_ldap_result2(
                if ( errno != EWOULDBLOCK && errno != EAGAIN ) {
                        close_connection( conn, op->o_connid, op->o_opid );
 
-                       pthread_mutex_unlock( &conn->c_pdumutex );
+                       ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
                        return;
                }
 
                /* wait for socket to be write-ready */
-               pthread_mutex_lock( &active_threads_mutex );
+               ldap_pvt_thread_mutex_lock( &active_threads_mutex );
                active_threads--;
                conn->c_writewaiter = 1;
 
-               pthread_kill( listener_tid, LDAP_SIGUSR1 );
+               ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
 
-               pthread_cond_wait( &conn->c_wcv, &active_threads_mutex );
-               pthread_mutex_unlock( &active_threads_mutex );
+               ldap_pvt_thread_cond_wait( &conn->c_wcv, &active_threads_mutex );
 
-               pthread_yield();
-               pthread_mutex_lock( &new_conn_mutex );
+               if( active_threads < 1 ) {
+                       ldap_pvt_thread_cond_signal(&active_threads_cond);
+               }
+               ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
+
+               ldap_pvt_thread_yield();
+               ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        }
-       pthread_mutex_unlock( &new_conn_mutex );
-       pthread_mutex_unlock( &conn->c_pdumutex );
+       ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
 
-       pthread_mutex_lock( &num_sent_mutex );
+       ldap_pvt_thread_mutex_lock( &num_sent_mutex );
        num_bytes_sent += bytes;
-       pthread_mutex_unlock( &num_sent_mutex );
+       ldap_pvt_thread_mutex_unlock( &num_sent_mutex );
 
        Statslog( LDAP_DEBUG_STATS,
            "conn=%d op=%d RESULT err=%d tag=%d nentries=%d\n", conn->c_connid,
@@ -189,14 +193,15 @@ send_search_entry(
 
        Debug( LDAP_DEBUG_TRACE, "=> send_search_entry (%s)\n", e->e_dn, 0, 0 );
 
-       if ( ! access_allowed( be, conn, op, e, "entry", NULL, op->o_dn,
-           ACL_READ ) ) {
+       if ( ! access_allowed( be, conn, op, e,
+               "entry", NULL, ACL_READ ) )
+       {
                Debug( LDAP_DEBUG_ACL, "acl: access to entry not allowed\n",
                    0, 0, 0 );
                return( 1 );
        }
 
-       edn = dn_normalize_case( strdup( e->e_dn ) );
+       edn = e->e_ndn;
 
 #ifdef LDAP_COMPAT30
        if ( (ber = ber_alloc_t( conn->c_version == 30 ? 0 : LBER_USE_DER ))
@@ -247,12 +252,12 @@ send_search_entry(
                                a->a_type, 0, 0 );
                        acl = NULL;
                } else {
-                       acl = acl_get_applicable( be, op, e, a->a_type, edn,
+                       acl = acl_get_applicable( be, op, e, a->a_type,
                                MAXREMATCHES, matches );
                }
 
-               if ( ! acl_access_allowed( acl, be, conn, e, NULL, op, ACL_READ,
-                       edn, matches ) ) 
+               if ( ! acl_access_allowed( acl, be, conn, e,
+                       NULL, op, ACL_READ, edn, matches ) ) 
                {
                        continue;
                }
@@ -298,8 +303,6 @@ send_search_entry(
                }
        }
 
-       free(edn);
-
 #ifdef LDAP_COMPAT30
        if ( conn->c_version == 30 ) {
                rc = ber_printf( ber, "}}}}" );
@@ -316,13 +319,13 @@ send_search_entry(
        }
 
        /* write only one pdu at a time - wait til it's our turn */
-       pthread_mutex_lock( &conn->c_pdumutex );
+       ldap_pvt_thread_mutex_lock( &conn->c_pdumutex );
 
        bytes = ber->ber_ptr - ber->ber_buf;
-       pthread_mutex_lock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        while ( conn->c_connid == op->o_connid && ber_flush( &conn->c_sb, ber,
            1 ) != 0 ) {
-               pthread_mutex_unlock( &new_conn_mutex );
+               ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
                /*
                 * we got an error.  if it's ewouldblock, we need to
                 * wait on the socket being writable.  otherwise, figure
@@ -336,30 +339,34 @@ send_search_entry(
                if ( errno != EWOULDBLOCK && errno != EAGAIN ) {
                        close_connection( conn, op->o_connid, op->o_opid );
 
-                       pthread_mutex_unlock( &conn->c_pdumutex );
+                       ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
                        return( -1 );
                }
 
                /* wait for socket to be write-ready */
-               pthread_mutex_lock( &active_threads_mutex );
+               ldap_pvt_thread_mutex_lock( &active_threads_mutex );
                active_threads--;
                conn->c_writewaiter = 1;
-               pthread_kill( listener_tid, LDAP_SIGUSR1 );
-               pthread_cond_wait( &conn->c_wcv, &active_threads_mutex );
-               pthread_mutex_unlock( &active_threads_mutex );
+               ldap_pvt_thread_kill( listener_tid, LDAP_SIGUSR1 );
+               ldap_pvt_thread_cond_wait( &conn->c_wcv, &active_threads_mutex );
+
+               if( active_threads < 1 ) {
+                       ldap_pvt_thread_cond_signal(&active_threads_cond);
+               }
+               ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
 
-               pthread_yield();
-               pthread_mutex_lock( &new_conn_mutex );
+               ldap_pvt_thread_yield();
+               ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        }
-       pthread_mutex_unlock( &new_conn_mutex );
-       pthread_mutex_unlock( &conn->c_pdumutex );
+       ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_unlock( &conn->c_pdumutex );
 
-       pthread_mutex_lock( &num_sent_mutex );
+       ldap_pvt_thread_mutex_lock( &num_sent_mutex );
        num_bytes_sent += bytes;
        num_entries_sent++;
-       pthread_mutex_unlock( &num_sent_mutex );
+       ldap_pvt_thread_mutex_unlock( &num_sent_mutex );
 
-       pthread_mutex_lock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        if ( conn->c_connid == op->o_connid ) {
                rc = 0;
                Statslog( LDAP_DEBUG_STATS2, "conn=%d op=%d ENTRY dn=\"%s\"\n",
@@ -367,14 +374,13 @@ send_search_entry(
        } else {
                rc = -1;
        }
-       pthread_mutex_unlock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
 
        Debug( LDAP_DEBUG_TRACE, "<= send_search_entry\n", 0, 0, 0 );
 
        return( rc );
 
 error_return:;
-       free(edn);
        return( 1 );
 }
 
@@ -441,7 +447,7 @@ str2result(
 void
 close_connection( Connection *conn, int opconnid, int opid )
 {
-       pthread_mutex_lock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_lock( &new_conn_mutex );
        if ( conn->c_sb.sb_sd != -1 && conn->c_connid == opconnid ) {
                Statslog( LDAP_DEBUG_STATS,
                    "conn=%d op=%d fd=%d closed errno=%d\n", conn->c_connid,
@@ -450,5 +456,5 @@ close_connection( Connection *conn, int opconnid, int opid )
                conn->c_sb.sb_sd = -1;
                conn->c_version = 0;
        }
-       pthread_mutex_unlock( &new_conn_mutex );
+       ldap_pvt_thread_mutex_unlock( &new_conn_mutex );
 }