From 63f9ff6247a901786b63413eda8e01082d74c6b4 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Tue, 12 Feb 2008 21:27:26 +0000 Subject: [PATCH] ITS#5374 --- CHANGES | 1 + servers/slapd/overlays/accesslog.c | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 12bbac7c08..06fd570fb5 100644 --- 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) diff --git a/servers/slapd/overlays/accesslog.c b/servers/slapd/overlays/accesslog.c index cbb7201df5..d63b427229 100644 --- a/servers/slapd/overlays/accesslog.c +++ b/servers/slapd/overlays/accesslog.c @@ -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 ))) { -- 2.39.5