]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#8698 Defer policy checker cleanup if it's a pw extop
authorOndřej Kuzník <ondra@mistotebe.net>
Fri, 26 Mar 2021 11:50:11 +0000 (11:50 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 30 Mar 2021 02:10:19 +0000 (02:10 +0000)
servers/slapd/overlays/ppolicy.c

index 49c887d5e63b5f63e2fd2fca7ff643e9980bc9de..49863a7c6c0096dd1b8c045c66f835bed9e396ad 100644 (file)
@@ -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 ) {