]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/modify.c
Plug memory leak
[openldap] / servers / slapd / back-bdb / modify.c
index 965bb0b0980dc13d514741dd9d355f3062397343..3f267b03131ca2d99a1a3a48dc73f6b6245dd737 100644 (file)
@@ -277,6 +277,12 @@ bdb_modify(
 
        int             noop = 0;
 
+#ifdef LDAP_CLIENT_UPDATE
+       Operation* ps_list;
+       struct psid_entry* pm_list;
+       struct psid_entry* pm_prev;
+#endif
+
 #ifdef NEW_LOGGING
        LDAP_LOG ( OPERATION, ENTRY, "bdb_modify: %s\n", dn->bv_val, 0, 0 );
 #else
@@ -295,6 +301,17 @@ retry:     /* transaction retry */
                Debug(LDAP_DEBUG_TRACE,
                        "bdb_modify: retrying...\n", 0, 0, 0);
 #endif
+
+#ifdef LDAP_CLIENT_UPDATE
+               pm_list = LDAP_LIST_FIRST(&op->premodify_list);
+               while ( pm_list != NULL ) {
+                       LDAP_LIST_REMOVE ( pm_list, link );
+                       pm_prev = pm_list;
+                       pm_list = LDAP_LIST_NEXT ( pm_list, link );
+                       free (pm_prev);
+               }
+#endif
+
                rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
@@ -405,6 +422,14 @@ retry:     /* transaction retry */
                ber_bvarray_free( refs );
                goto done;
        }
+
+#ifdef LDAP_CLIENT_UPDATE
+       if ( rc == LDAP_SUCCESS && !op->o_noop ) {
+               LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
+                       bdb_psearch(be, conn, op, ps_list, e, LCUP_PSEARCH_BY_PREMODIFY );
+               }
+       }
+#endif /* LDAP_CLIENT_UPDATE */
        
        /* Modify the entry */
        rc = bdb_modify_internal( be, conn, op, ltid, modlist, e,
@@ -493,6 +518,24 @@ return_results:
        send_ldap_result( conn, op, rc,
                NULL, text, NULL, NULL );
 
+#ifdef LDAP_CLIENT_UPDATE
+       if ( rc == LDAP_SUCCESS && !op->o_noop ) {
+               /* Loop through in-scope entries for each psearch spec */
+               LDAP_LIST_FOREACH ( ps_list, &bdb->psearch_list, link ) {
+                       bdb_psearch( be, conn, op, ps_list, e, LCUP_PSEARCH_BY_MODIFY );
+               }
+               pm_list = LDAP_LIST_FIRST(&op->premodify_list);
+               while ( pm_list != NULL ) {
+                       bdb_psearch(be, conn, op, pm_list->ps->op,
+                                               e, LCUP_PSEARCH_BY_SCOPEOUT);
+                       LDAP_LIST_REMOVE ( pm_list, link );
+                       pm_prev = pm_list;
+                       pm_list = LDAP_LIST_NEXT ( pm_list, link );
+                       free (pm_prev);
+               }
+       }
+#endif /* LDAP_CLIENT_UPDATE */
+
        if( rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
                ldap_pvt_thread_yield();
                TXN_CHECKPOINT( bdb->bi_dbenv,
@@ -501,6 +544,15 @@ return_results:
 
 done:
        if( ltid != NULL ) {
+#ifdef LDAP_CLIENT_UPDATE
+               pm_list = LDAP_LIST_FIRST(&op->premodify_list);
+               while ( pm_list != NULL ) {
+                       LDAP_LIST_REMOVE ( pm_list, link );
+                       pm_prev = pm_list;
+                       pm_list = LDAP_LIST_NEXT ( pm_list, link );
+                       free (pm_prev);
+               }
+#endif
                TXN_ABORT( ltid );
                op->o_private = NULL;
        }