From 6cc8b49819977fc4d3e463643c6521eba03b5ea8 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Fri, 7 Dec 2007 19:50:54 +0000 Subject: [PATCH] ITS#5161 --- CHANGES | 1 + servers/slapd/overlays/accesslog.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/CHANGES b/CHANGES index 968e95fd47..95b9b5f7d8 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,7 @@ OpenLDAP 2.4.7 Release (2007/12/01) Fixed slapd-bdb/hdb dn2entry lock bug (ITS#5257) Fixed slapd-bdb/hdb dn2id lock bug (ITS#5262) Fixed slapd-hdb caching on rename ops (ITS#5221) + Fixed slapo-accesslog abandoned op cleanup (ITS#5161) Fixed slapo-pcache op->o_abandon handling (ITS#5187) Fixed slapo-ppolicy single password check on modify (ITS#5146) Fixed slapo-ppolicy internal search (ITS#5235) diff --git a/servers/slapd/overlays/accesslog.c b/servers/slapd/overlays/accesslog.c index ff04ea5dd0..90205ca45c 100644 --- a/servers/slapd/overlays/accesslog.c +++ b/servers/slapd/overlays/accesslog.c @@ -67,6 +67,7 @@ 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; @@ -1341,6 +1342,7 @@ static int accesslog_response(Operation *op, SlapReply *rs) { ldap_pvt_thread_mutex_lock( &li->li_log_mutex ); old = li->li_old; li->li_old = NULL; + li->li_unlock = 0; ldap_pvt_thread_rmutex_unlock( &li->li_op_rmutex, op->o_tid ); } @@ -1686,6 +1688,25 @@ accesslog_op_bind( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } +static int +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 ) { + BackendInfo *bi = op->o_bd->bd_info; + op->o_bd->bd_info = (BackendInfo *)on; + accesslog_response( op, rs ); + op->o_bd->bd_info = bi; + } + return 0; +} + static int accesslog_op_mod( Operation *op, SlapReply *rs ) { @@ -1693,7 +1714,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 ); + cb->sc_cleanup = accesslog_mod_cleanup; + cb->sc_response = NULL; + cb->sc_private = on; + cb->sc_next = op->o_callback; + op->o_callback = 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