]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/dynlist.c
in op_response, rearrange contextCSN update checks
[openldap] / servers / slapd / overlays / dynlist.c
index 3a03c6a8df4803731977e42656654f57e932859c..97d28d89a23cdf836ae9eb3fadb38be70c6c3357 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2008 The OpenLDAP Foundation.
+ * Copyright 2003-2009 The OpenLDAP Foundation.
  * Portions Copyright 2004-2005 Pierangelo Masarati.
  * Portions Copyright 2008 Emmanuel Dreyfus.
  * All rights reserved.
@@ -266,8 +266,8 @@ dynlist_sc_update( Operation *op, SlapReply *rs )
        }
 
 #ifndef SLAP_OPATTRS
-       opattrs = ( rs->sr_attrs == NULL ) ? 0 : an_find( rs->sr_attrs, &AllOper );
-       userattrs = ( rs->sr_attrs == NULL ) ? 1 : an_find( rs->sr_attrs, &AllUser );
+       opattrs = ( rs->sr_attrs == NULL ) ? 0 : an_find( rs->sr_attrs, slap_bv_operational_attrs );
+       userattrs = ( rs->sr_attrs == NULL ) ? 1 : an_find( rs->sr_attrs, slap_bv_user_attrs );
 #else /* SLAP_OPATTRS */
        opattrs = SLAP_OPATTRS( rs->sr_attr_flags );
        userattrs = SLAP_USERATTRS( rs->sr_attr_flags );
@@ -416,8 +416,8 @@ dynlist_prepare_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )
        }
 
 #ifndef SLAP_OPATTRS
-       opattrs = ( rs->sr_attrs == NULL ) ? 0 : an_find( rs->sr_attrs, &AllOper );
-       userattrs = ( rs->sr_attrs == NULL ) ? 1 : an_find( rs->sr_attrs, &AllUser );
+       opattrs = ( rs->sr_attrs == NULL ) ? 0 : an_find( rs->sr_attrs, slap_bv_operational_attrs );
+       userattrs = ( rs->sr_attrs == NULL ) ? 1 : an_find( rs->sr_attrs, slap_bv_user_attrs );
 #else /* SLAP_OPATTRS */
        opattrs = SLAP_OPATTRS( rs->sr_attr_flags );
        userattrs = SLAP_USERATTRS( rs->sr_attr_flags );
@@ -452,12 +452,13 @@ dynlist_prepare_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )
                o.o_groups = NULL;
        }
 
+       e_flags = rs->sr_flags;
        if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE ) ) {
                e = entry_dup( rs->sr_entry );
+               e_flags |= ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );
        } else {
                e = rs->sr_entry;
        }
-       e_flags = rs->sr_flags | ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );
 
        dlc.dlc_e = e;
        dlc.dlc_dli = dli;
@@ -855,12 +856,14 @@ done:;
 
                if ( r.sr_flags & REP_ENTRY_MUSTBEFREED ) {
                        entry_free( r.sr_entry );
+                       r.sr_entry = NULL;
+                       r.sr_flags ^= REP_ENTRY_MUSTBEFREED;
                }
        }
 
 release:;
        if ( e != NULL ) {
-               overlay_entry_release_ov( op, e, 0, on );
+               overlay_entry_release_ov( &o, e, 0, on );
        }
 
        return SLAP_CB_CONTINUE;
@@ -954,7 +957,7 @@ dynlist_db_config(
                ObjectClass             *oc;
                AttributeDescription    *ad = NULL,
                                        *member_ad = NULL;
-               dynlist_map_t           *dlm = NULL;
+               dynlist_map_t           *dlm = NULL, *dlml = NULL;
                const char              *text;
 
                if ( argc < 3 ) {
@@ -994,7 +997,6 @@ dynlist_db_config(
                        AttributeDescription *member_ad = NULL;
                        AttributeDescription *mapped_ad = NULL;
                        dynlist_map_t *dlmp;
-                       dynlist_map_t *dlml;
 
 
                        /*
@@ -1029,7 +1031,6 @@ dynlist_db_config(
                        dlmp = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) );
                        if ( dlm == NULL ) {
                                dlm = dlmp;
-                               dlml = NULL;
                        }
                        dlmp->dlm_member_ad = member_ad;
                        dlmp->dlm_mapped_ad = mapped_ad;
@@ -1259,7 +1260,7 @@ dl_cfgen( ConfigArgs *c )
                                }
 
                                *ptr++ = ' ';
-                               ptr = lutil_strncopy( ptr, dli->dli_oc->soc_cname.bv_val,
+                               ptr = lutil_strncopy( ptr, dli->dli_ad->ad_cname.bv_val,
                                        dli->dli_ad->ad_cname.bv_len );
 
                                for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) {
@@ -1403,7 +1404,7 @@ dl_cfgen( ConfigArgs *c )
                struct berval           nbase = BER_BVNULL;
                Filter                  *filter = NULL;
                struct berval           uri = BER_BVNULL;
-               dynlist_map_t           *dlm = NULL;
+               dynlist_map_t           *dlm = NULL, *dlml = NULL;
                const char              *text;
 
                oc = oc_find( c->argv[ 1 ] );
@@ -1531,7 +1532,6 @@ done_uri:;
                        AttributeDescription *member_ad = NULL;
                        AttributeDescription *mapped_ad = NULL;
                        dynlist_map_t *dlmp;
-                       dynlist_map_t *dlml;
 
 
                        /*
@@ -1569,7 +1569,6 @@ done_uri:;
                        dlmp = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) );
                        if ( dlm == NULL ) {
                                dlm = dlmp;
-                               dlml = NULL;
                        }
                        dlmp->dlm_member_ad = member_ad;
                        dlmp->dlm_mapped_ad = mapped_ad;