]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10473 Make sure sync control data gets freed
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 25 Mar 2026 14:10:09 +0000 (14:10 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 10 Apr 2026 03:15:42 +0000 (03:15 +0000)
servers/slapd/overlays/syncprov.c

index 26c6e7789492cdaea3defcb1a4961f71aa2d61eb..eeae7dae40bf3fb347640ead0704ccde701c38d1 100644 (file)
@@ -245,7 +245,15 @@ syncprov_state_ctrl(
 
        ret = ber_flatten2( ber, &bv, 0 );
        if ( ret == 0 ) {
-               cp = op->o_tmpalloc( sizeof( LDAPControl ) + bv.bv_len, op->o_tmpmemctx );
+               slap_callback *cb = op->o_tmpcalloc( 1,
+                               sizeof( slap_callback ) + sizeof( LDAPControl ) + bv.bv_len,
+                               op->o_tmpmemctx );
+
+               cb->sc_cleanup = slap_freeself_cb;
+               cb->sc_next = op->o_callback;
+               overlay_callback_after_backover( op, cb, 1 );
+
+               cp = (LDAPControl *)&cb[1];
                cp->ldctl_oid = LDAP_CONTROL_SYNC_STATE;
                cp->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
                cp->ldctl_value.bv_val = (char *)&cp[1];
@@ -297,7 +305,15 @@ syncprov_done_ctrl(
 
        ret = ber_flatten2( ber, &bv, 0 );
        if ( ret == 0 ) {
-               cp = op->o_tmpalloc( sizeof( LDAPControl ) + bv.bv_len, op->o_tmpmemctx );
+               slap_callback *cb = op->o_tmpcalloc( 1,
+                               sizeof( slap_callback ) + sizeof( LDAPControl ) + bv.bv_len,
+                               op->o_tmpmemctx );
+
+               cb->sc_cleanup = slap_freeself_cb;
+               cb->sc_next = op->o_callback;
+               overlay_callback_after_backover( op, cb, 1 );
+
+               cp = (LDAPControl *)&cb[1];
                cp->ldctl_oid = LDAP_CONTROL_SYNC_DONE;
                cp->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
                cp->ldctl_value.bv_val = (char *)&cp[1];