]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/dynlist.c
remove REP_ENTRY_MUSTRELEASE when copying (ITS#6423)
[openldap] / servers / slapd / overlays / dynlist.c
index 1210b6582a61d67de7eac416cd27328711fe3854..1b83f9f41d01e219c63057058138d0d88eb2373e 100644 (file)
@@ -170,20 +170,27 @@ dynlist_is_dynlist_next( Operation *op, SlapReply *rs, dynlist_info_t *old_dli )
 }
 
 static int
-dynlist_make_filter( Operation *op, struct berval *oldf, struct berval *newf )
+dynlist_make_filter( Operation *op, Entry *e, const char *url, struct berval *oldf, struct berval *newf )
 {
        slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;
        dynlist_info_t  *dli = (dynlist_info_t *)on->on_bi.bi_private;
 
        char            *ptr;
+       int             needBrackets = 0;
 
        assert( oldf != NULL );
        assert( newf != NULL );
        assert( !BER_BVISNULL( oldf ) );
        assert( !BER_BVISEMPTY( oldf ) );
 
+       if ( oldf->bv_val[0] != '(' ) {
+               Debug( LDAP_DEBUG_ANY, "%s: dynlist, DN=\"%s\": missing brackets in URI=\"%s\" filter\n",
+                       op->o_log_prefix, e->e_name.bv_val, url );
+               needBrackets = 2;
+       }
+
        newf->bv_len = STRLENOF( "(&(!(objectClass=" "))" ")" )
-               + dli->dli_oc->soc_cname.bv_len + oldf->bv_len;
+               + dli->dli_oc->soc_cname.bv_len + oldf->bv_len + needBrackets;
        newf->bv_val = op->o_tmpalloc( newf->bv_len + 1, op->o_tmpmemctx );
        if ( newf->bv_val == NULL ) {
                return -1;
@@ -191,7 +198,9 @@ dynlist_make_filter( Operation *op, struct berval *oldf, struct berval *newf )
        ptr = lutil_strcopy( newf->bv_val, "(&(!(objectClass=" );
        ptr = lutil_strcopy( ptr, dli->dli_oc->soc_cname.bv_val );
        ptr = lutil_strcopy( ptr, "))" );
+       if ( needBrackets ) *ptr++ = '(';
        ptr = lutil_strcopy( ptr, oldf->bv_val );
+       if ( needBrackets ) *ptr++ = ')';
        ptr = lutil_strcopy( ptr, ")" );
        newf->bv_len = ptr - newf->bv_val;
 
@@ -266,8 +275,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 +425,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 );
@@ -456,6 +465,7 @@ dynlist_prepare_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )
        if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE ) ) {
                e = entry_dup( rs->sr_entry );
                e_flags |= ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );
+               e_flags &= ~REP_ENTRY_MUSTRELEASE;
        } else {
                e = rs->sr_entry;
        }
@@ -611,7 +621,7 @@ dynlist_prepare_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )
                } else {
                        struct berval   flt;
                        ber_str2bv( lud->lud_filter, 0, 0, &flt );
-                       if ( dynlist_make_filter( op, &flt, &o.ors_filterstr ) ) {
+                       if ( dynlist_make_filter( op, rs->sr_entry, url->bv_val, &flt, &o.ors_filterstr ) ) {
                                /* error */
                                goto cleanup;
                        }
@@ -863,7 +873,7 @@ done:;
 
 release:;
        if ( e != NULL ) {
-               overlay_entry_release_ov( op, e, 0, on );
+               overlay_entry_release_ov( &o, e, 0, on );
        }
 
        return SLAP_CB_CONTINUE;
@@ -957,7 +967,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 ) {
@@ -997,7 +1007,6 @@ dynlist_db_config(
                        AttributeDescription *member_ad = NULL;
                        AttributeDescription *mapped_ad = NULL;
                        dynlist_map_t *dlmp;
-                       dynlist_map_t *dlml;
 
 
                        /*
@@ -1032,7 +1041,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;
@@ -1262,8 +1270,8 @@ dl_cfgen( ConfigArgs *c )
                                }
 
                                *ptr++ = ' ';
-                               ptr = lutil_strncopy( ptr, dli->dli_oc->soc_cname.bv_val,
-                                       dli->dli_oc->soc_cname.bv_len );
+                               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 ) {
                                        ptr[ 0 ] = ' ';
@@ -1406,7 +1414,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 ] );
@@ -1534,7 +1542,6 @@ done_uri:;
                        AttributeDescription *member_ad = NULL;
                        AttributeDescription *mapped_ad = NULL;
                        dynlist_map_t *dlmp;
-                       dynlist_map_t *dlml;
 
 
                        /*
@@ -1572,7 +1579,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;