]> git.sur5r.net Git - openldap/commitdiff
ITS#5374
authorQuanah Gibson-Mount <quanah@openldap.org>
Tue, 12 Feb 2008 21:27:26 +0000 (21:27 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 12 Feb 2008 21:27:26 +0000 (21:27 +0000)
CHANGES
servers/slapd/overlays/accesslog.c

diff --git a/CHANGES b/CHANGES
index 12bbac7c08bc38c70a31b927561e3c104413f672..06fd570fb5797b299b3b523b6a5c3e2c5b5f7f75 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -38,6 +38,7 @@ OpenLDAP 2.4.8 Engineering
        Fixed slapd-monitor crash (ITS#5311)
        Fixed slapd-relay compare (ITS#4937)
        Added slapd-sock (ITS#4094)
+       Fixed slapo-accesslog cleanup on successful response (ITS#5374)
        Added slapo-autogroup contrib module (ITS#5145)
        Added slapo-constraint cross-attribute constraints (ITS#4987)
        Fixed slapo-memberof objectClass inheritance (ITS#5299)
index cbb7201df5412a40ae5cc16adb5c8872bb1686c2..d63b427229a0e491b2a4ce2ffea98eb2ea2e0c98 100644 (file)
@@ -67,7 +67,6 @@ typedef struct log_info {
        Entry *li_old;
        log_attr *li_oldattrs;
        int li_success;
-       int li_unlock;
        ldap_pvt_thread_rmutex_t li_op_rmutex;
        ldap_pvt_thread_mutex_t li_log_mutex;
 } log_info;
@@ -1339,10 +1338,17 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
                return SLAP_CB_CONTINUE;
 
        if ( lo->mask & LOG_OP_WRITES ) {
+               slap_callback *cb;
                ldap_pvt_thread_mutex_lock( &li->li_log_mutex );
                old = li->li_old;
                li->li_old = NULL;
-               li->li_unlock = 0;
+               /* Disarm mod_cleanup */
+               for ( cb = op->o_callback->sc_next; cb; cb = cb->sc_next ) {
+                       if ( cb->sc_private == (void *)on ) {
+                               cb->sc_private = NULL;
+                               break;
+                       }
+               }
                ldap_pvt_thread_rmutex_unlock( &li->li_op_rmutex, op->o_tid );
        }
 
@@ -1693,12 +1699,11 @@ accesslog_mod_cleanup( Operation *op, SlapReply *rs )
 {
        slap_callback *sc = op->o_callback;
        slap_overinst *on = sc->sc_private;
-       log_info *li = on->on_bi.bi_private;
        op->o_callback = sc->sc_next;
 
        op->o_tmpfree( sc, op->o_tmpmemctx );
 
-       if ( li->li_unlock ) {
+       if ( on ) {
                BackendInfo *bi = op->o_bd->bd_info;
                op->o_bd->bd_info = (BackendInfo *)on;
                accesslog_response( op, rs );
@@ -1714,15 +1719,15 @@ accesslog_op_mod( Operation *op, SlapReply *rs )
        log_info *li = on->on_bi.bi_private;
 
        if ( li->li_ops & LOG_OP_WRITES ) {
-               slap_callback *cb = op->o_tmpalloc( sizeof( slap_callback ), op->o_tmpmemctx );
+               slap_callback *cb = op->o_tmpalloc( sizeof( slap_callback ), op->o_tmpmemctx ), *cb2;
                cb->sc_cleanup = accesslog_mod_cleanup;
                cb->sc_response = NULL;
                cb->sc_private = on;
-               cb->sc_next = op->o_callback;
-               op->o_callback = cb;
+               cb->sc_next = NULL;
+               for ( cb2 = op->o_callback; cb2->sc_next; cb2 = cb2->sc_next );
+               cb2->sc_next = cb;
 
                ldap_pvt_thread_rmutex_lock( &li->li_op_rmutex, op->o_tid );
-               li->li_unlock = 1;
                if ( li->li_oldf && ( op->o_tag == LDAP_REQ_DELETE ||
                        op->o_tag == LDAP_REQ_MODIFY ||
                        ( op->o_tag == LDAP_REQ_MODRDN && li->li_oldattrs ))) {