From: Howard Chu Date: Fri, 6 Feb 2026 20:00:57 +0000 (+0000) Subject: ITS#10448 slapo-syncprov: free parsed control when operation completes X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa3b4ba8239e068c04c25ded2293422efcfbdcbc;p=thirdparty%2Fopenldap.git ITS#10448 slapo-syncprov: free parsed control when operation completes --- diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index faac81bc0b..db5e59927b 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -4250,6 +4250,29 @@ syncprov_db_destroy( return 0; } +static int +syncprov_ctrl_cleanup( Operation *op, SlapReply *rs ) +{ + if ( rs->sr_type != REP_RESULT ) + return SLAP_CB_CONTINUE; + + if ( op->o_controls[slap_cids.sc_LDAPsync] ) { + sync_control *sr = op->o_controls[slap_cids.sc_LDAPsync]; + op->o_controls[slap_cids.sc_LDAPsync] = NULL; + if ( sr->sr_state.ctxcsn ) { + ber_bvarray_free_x( sr->sr_state.ctxcsn, op->o_tmpmemctx ); + } + if ( sr->sr_state.sids ) { + op->o_tmpfree( sr->sr_state.sids, op->o_tmpmemctx ); + } + if ( sr->sr_state.octet_str.bv_val ) { + op->o_tmpfree( sr->sr_state.octet_str.bv_val, op->o_tmpmemctx ); + } + op->o_tmpfree( sr, op->o_tmpmemctx ); + } + return slap_freeself_cb( op, rs ); +} + static int syncprov_parseCtrl ( Operation *op, SlapReply *rs, @@ -4357,6 +4380,13 @@ static int syncprov_parseCtrl ( op->o_sync_mode |= mode; /* o_sync_mode shares o_sync */ + { + slap_callback *cb = op->o_tmpcalloc( 1, sizeof(slap_callback), op->o_tmpmemctx ); + cb->sc_cleanup = syncprov_ctrl_cleanup; + cb->sc_next = op->o_callback; + op->o_callback = cb; + } + return LDAP_SUCCESS; }