From: Ondřej Kuzník Date: Fri, 26 Mar 2021 11:50:11 +0000 (+0000) Subject: ITS#8698 Defer policy checker cleanup if it's a pw extop X-Git-Tag: OPENLDAP_REL_ENG_2_5_3BETA~3^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51c444b0651c0dd0ed50f099254ef982dedf9bf1;p=thirdparty%2Fopenldap.git ITS#8698 Defer policy checker cleanup if it's a pw extop --- diff --git a/servers/slapd/overlays/ppolicy.c b/servers/slapd/overlays/ppolicy.c index 49c887d5e6..49863a7c6c 100644 --- a/servers/slapd/overlays/ppolicy.c +++ b/servers/slapd/overlays/ppolicy.c @@ -2326,6 +2326,21 @@ ppolicy_mod_cb( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } +static int +ppolicy_text_cleanup( Operation *op, SlapReply *rs ) +{ + slap_callback *sc = op->o_callback; + + if ( rs->sr_text == sc->sc_private ) { + rs->sr_text = NULL; + } + free( sc->sc_private ); + + op->o_callback = sc->sc_next; + op->o_tmpfree( sc, op->o_tmpmemctx ); + return SLAP_CB_CONTINUE; +} + static int ppolicy_modify( Operation *op, SlapReply *rs ) { @@ -3083,8 +3098,21 @@ return_results: } send_ldap_result( op, rs ); if ( free_txt ) { - free( (char *)txt ); - rs->sr_text = NULL; + if ( is_pwdexop ) { + slap_callback *cb; + cb = op->o_tmpcalloc( sizeof(ppbind)+sizeof(slap_callback), + 1, op->o_tmpmemctx ); + + /* Setup a callback so we can free the text when sent */ + cb->sc_cleanup = ppolicy_text_cleanup; + cb->sc_private = (void *)txt; + overlay_callback_after_backover( op, cb, 1 ); + } else { + if ( rs->sr_text == txt ) { + rs->sr_text = NULL; + } + free( (char *)txt ); + } } if ( send_ctrl ) { if ( is_pwdexop ) {