]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/rwm.c
Fix modify deadlock
[openldap] / servers / slapd / overlays / rwm.c
index 10aeea9736815790bdae1a7d9a05b54816f2dfe2..b696e379427ac3b434ef4325fc62cb6fca642405 100644 (file)
@@ -171,8 +171,8 @@ rwm_op_add( Operation *op, SlapReply *rs )
                                }
                        }
 
-                       if ( (*ap)->a_desc->ad_type->sat_syntax
-                                       == slap_schema.si_syn_distinguishedName )
+                       if ( (*ap)->a_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName
+                                       || ( mapping != NULL && mapping->m_dst_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )
                        {
                                /*
                                 * FIXME: rewrite could fail; in this case
@@ -327,7 +327,8 @@ rwm_op_compare( Operation *op, SlapReply *rs )
                        ad = mapping->m_dst_ad;
                }
 
-               if ( op->orc_ava->aa_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName )
+               if ( op->orc_ava->aa_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName
+                               || ( mapping != NULL && mapping->m_dst_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )
                {
                        struct berval   *mapped_valsp[2];
                        
@@ -436,11 +437,11 @@ rwm_op_modify( Operation *op, SlapReply *rs )
                                last--;
 
                                for ( j = 0; !BER_BVISNULL( &(*mlp)->sml_values[ j ] ); j++ ) {
-                                       struct ldapmapping      *mapping = NULL;
-
+                                       struct ldapmapping      *oc_mapping = NULL;
+               
                                        ( void )rwm_mapping( &rwmap->rwm_oc, &(*mlp)->sml_values[ j ],
-                                                       &mapping, RWM_MAP );
-                                       if ( mapping == NULL ) {
+                                                       &oc_mapping, RWM_MAP );
+                                       if ( oc_mapping == NULL ) {
                                                if ( rwmap->rwm_at.drop_missing ) {
                                                        /* FIXME: we allow to remove objectClasses as well;
                                                         * if the resulting entry is inconsistent, that's
@@ -457,13 +458,13 @@ rwm_op_modify( Operation *op, SlapReply *rs )
        
                                        } else {
                                                ch_free( (*mlp)->sml_values[ j ].bv_val );
-                                               ber_dupbv( &(*mlp)->sml_values[ j ], &mapping->m_dst );
+                                               ber_dupbv( &(*mlp)->sml_values[ j ], &oc_mapping->m_dst );
                                        }
                                }
 
                        } else {
-                               if ( (*mlp)->sml_desc->ad_type->sat_syntax ==
-                                               slap_schema.si_syn_distinguishedName )
+                               if ( (*mlp)->sml_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName
+                                               || ( mapping != NULL && mapping->m_dst_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )
                                {
 #ifdef ENABLE_REWRITE
                                        rc = rwm_dnattr_rewrite( op, rs, "modifyAttrDN",
@@ -516,7 +517,6 @@ cleanup_mod:;
                free( ml );
        }
 
-       /* TODO: rewrite attribute types, values of DN-valued attributes ... */
        return SLAP_CB_CONTINUE;
 }
 
@@ -822,7 +822,7 @@ rwm_attrs( Operation *op, SlapReply *rs, Attribute** a_first, int stripEntryDN )
         * about duplicate values?) */
        isupdate = be_shadow_update( op );
        for ( ap = a_first; *ap; ) {
-               struct ldapmapping      *mapping;
+               struct ldapmapping      *mapping = NULL;
                int                     drop_missing;
                int                     last;
                Attribute               *a;
@@ -832,6 +832,13 @@ rwm_attrs( Operation *op, SlapReply *rs, Attribute** a_first, int stripEntryDN )
                        /* go on */ ;
                        
                } else {
+                       if ( op->ors_attrs != NULL && 
+                                       !SLAP_USERATTRS( rs->sr_attr_flags ) &&
+                                       !ad_inlist( (*ap)->a_desc, op->ors_attrs ) )
+                       {
+                               goto cleanup_attr;
+                       }
+
                        drop_missing = rwm_mapping( &rwmap->rwm_at,
                                        &(*ap)->a_desc->ad_cname, &mapping, RWM_REMAP );
                        if ( drop_missing || ( mapping != NULL && BER_BVISEMPTY( &mapping->m_dst ) ) )
@@ -842,13 +849,6 @@ rwm_attrs( Operation *op, SlapReply *rs, Attribute** a_first, int stripEntryDN )
                        if ( mapping != NULL ) {
                                (*ap)->a_desc = mapping->m_dst_ad;
                        }
-
-                       if ( op->ors_attrs != NULL && 
-                                       !SLAP_USERATTRS( rs->sr_attr_flags ) &&
-                                       !ad_inlist( (*ap)->a_desc, op->ors_attrs ) )
-                       {
-                               goto cleanup_attr;
-                       }
                }
 
                if ( (*ap)->a_desc == slap_schema.si_ad_entryDN ) {
@@ -915,8 +915,8 @@ rwm_attrs( Operation *op, SlapReply *rs, Attribute** a_first, int stripEntryDN )
                 * everything pass thru the ldap backend. */
                /* FIXME: handle distinguishedName-like syntaxes, like
                 * nameAndOptionalUID */
-               } else if ( (*ap)->a_desc->ad_type->sat_syntax ==
-                               slap_schema.si_syn_distinguishedName )
+               } else if ( (*ap)->a_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName
+                               || ( mapping != NULL && mapping->m_src_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )
                {
 #ifdef ENABLE_REWRITE
                        dc.ctx = "searchAttrDN";
@@ -1033,9 +1033,11 @@ rwm_send_entry( Operation *op, SlapReply *rs )
         * to return, and remap them accordingly */
        (void)rwm_attrs( op, rs, &e->e_attrs, 1 );
 
+#if 0
        if ( rs->sr_operational_attrs ) {
                (void)rwm_attrs( op, rs, &rs->sr_operational_attrs, 0 );
        }
+#endif
 
        rs->sr_entry = e;
        rs->sr_flags = flags;
@@ -1251,7 +1253,9 @@ rwm_response( Operation *op, SlapReply *rs )
        switch( op->o_tag ) {
        case LDAP_REQ_SEARCH:
                /* Note: the operation attrs are remapped */
-               if ( op->ors_attrs != NULL && op->ors_attrs != rs->sr_attrs )
+               if ( rs->sr_type == REP_RESULT
+                               && op->ors_attrs != NULL
+                               && op->ors_attrs != rs->sr_attrs )
                {
                        ch_free( op->ors_attrs );
                        op->ors_attrs = rs->sr_attrs;