]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/memberof.c
ITS#5572 retrieve main DB's ACL before relevant operations
[openldap] / servers / slapd / overlays / memberof.c
index 0dec9c86ed2396fe3cd2ad37133b4fd0272032cf..72b29ed8dfeb5e43a1d7761b764dbd04dc12937e 100644 (file)
@@ -194,7 +194,7 @@ memberof_saved_member_free( void *key, void *data )
 static BerVarray
 memberof_saved_member_get( Operation *op, void *keyp )
 {
-       BerVarray       vals;
+       void            *vals;
        BerVarray       *key = (BerVarray *)keyp;
 
        assert( op != NULL );
@@ -204,10 +204,8 @@ memberof_saved_member_get( Operation *op, void *keyp )
                *key = NULL;
 
        } else {
-               ldap_pvt_thread_pool_getkey( op->o_threadctx,
-                               key, (void **)&vals, NULL );
                ldap_pvt_thread_pool_setkey( op->o_threadctx,
-                               key, NULL, NULL );
+                               key, NULL, 0, &vals, NULL );
        }
 
        return vals;
@@ -232,9 +230,9 @@ memberof_saved_member_set( Operation *op, void *keyp, BerVarray vals )
                *key = saved_vals;
 
        } else {
-               BerVarray       old_vals = NULL;
+               void    *old_vals = NULL;
 
-               ldap_pvt_thread_pool_setkey_x( op->o_threadctx, key,
+               ldap_pvt_thread_pool_setkey( op->o_threadctx, key,
                                saved_vals, memberof_saved_member_free, &old_vals, NULL );
                if ( old_vals != NULL ) {
                        ber_bvarray_free( old_vals );
@@ -472,8 +470,10 @@ memberof_value_modify(
                        char buf[ SLAP_TEXT_BUFLEN ];
                        snprintf( buf, sizeof( buf ),
                                "memberof_value_modify %s=\"%s\" failed err=%d text=%s",
-                               ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err, rs2.sr_text );
-                       Debug( LDAP_DEBUG_ANY, "%s: %s\n", op->o_log_prefix, buf, 0 );
+                               ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err,
+                               rs2.sr_text ? rs2.sr_text : "" );
+                       Debug( LDAP_DEBUG_ANY, "%s: %s\n",
+                               op->o_log_prefix, buf, 0 );
                }
 
                assert( op2.orm_modlist == &mod[ mcnt ] );
@@ -486,6 +486,8 @@ memberof_value_modify(
                if ( ml != NULL ) {
                        slap_mods_free( ml, 1 );
                }
+
+               mod[ 0 ].sml_next = NULL;
        }
 
        if ( old_ndn != NULL ) {
@@ -503,8 +505,10 @@ memberof_value_modify(
                        char buf[ SLAP_TEXT_BUFLEN ];
                        snprintf( buf, sizeof( buf ),
                                "memberof_value_modify %s=\"%s\" failed err=%d text=%s",
-                               ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err, rs2.sr_text );
-                       Debug( LDAP_DEBUG_ANY, "%s: %s\n", op->o_log_prefix, buf, 0 );
+                               ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err,
+                               rs2.sr_text ? rs2.sr_text : "" );
+                       Debug( LDAP_DEBUG_ANY, "%s: %s\n",
+                               op->o_log_prefix, buf, 0 );
                }
 
                assert( op2.orm_modlist == &mod[ mcnt ] );
@@ -567,7 +571,7 @@ memberof_op_add( Operation *op, SlapReply *rs )
                        && is_entry_objectclass_or_sub( op->ora_e, mo->mo_oc_group ) )
        {
                op->o_dn = op->o_bd->be_rootdn;
-               op->o_dn = op->o_bd->be_rootndn;
+               op->o_ndn = op->o_bd->be_rootndn;
                op->o_bd->bd_info = (BackendInfo *)on->on_info;
 
                for ( ap = &op->ora_e->e_attrs; *ap; ) {
@@ -801,7 +805,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                        BerVarray       vals = NULL;
 
                        op->o_dn = op->o_bd->be_rootdn;
-                       op->o_dn = op->o_bd->be_rootndn;
+                       op->o_ndn = op->o_bd->be_rootndn;
                        op->o_bd->bd_info = (BackendInfo *)on->on_info;
                        rc = backend_attribute( op, NULL, &op->o_req_ndn,
                                        mo->mo_ad_member, &vals, ACL_READ );
@@ -816,7 +820,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                && !get_relax( op ) )
                {
                        op->o_dn = op->o_bd->be_rootdn;
-                       op->o_dn = op->o_bd->be_rootndn;
+                       op->o_ndn = op->o_bd->be_rootndn;
                        op->o_bd->bd_info = (BackendInfo *)on->on_info;
                
                        assert( op->orm_modlist != NULL );
@@ -839,6 +843,12 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                        break;
                
                                case LDAP_MOD_REPLACE:
+                                       /* Handle this just like a delete (see above) */
+                                       if ( !ml->sml_values ) {
+                                               mlp = &ml->sml_next;
+                                               break;
+                                       }
                                case LDAP_MOD_ADD:
                                        /* NOTE: right now, the attributeType we use
                                         * for member must have a normalized value */
@@ -1034,7 +1044,7 @@ memberof_op_modify( Operation *op, SlapReply *rs )
                                goto done2;
                        }
 
-                       if ( ml->sml_op == LDAP_MOD_DELETE ) {
+                       if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
                                break;
                        }
                        /* fall thru */
@@ -1301,7 +1311,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
                                ber_bvarray_free_x( vals, op->o_tmpmemctx );
                        }
 
-                       if ( ml->sml_op == LDAP_MOD_DELETE ) {
+                       if ( ml->sml_op == LDAP_MOD_DELETE || !mml->sml_values ) {
                                break;
                        }
                        /* fall thru */
@@ -1358,7 +1368,7 @@ memberof_res_modify( Operation *op, SlapReply *rs )
                                        ber_bvarray_free_x( vals, op->o_tmpmemctx );
                                }
        
-                               if ( ml->sml_op == LDAP_MOD_DELETE ) {
+                               if ( ml->sml_op == LDAP_MOD_DELETE || !ml->sml_values ) {
                                        break;
                                }
                                /* fall thru */
@@ -1509,7 +1519,7 @@ memberof_db_init(
        ConfigReply     *cr )
 {
        slap_overinst   *on = (slap_overinst *)be->bd_info;
-       memberof_t      tmp_mo = { 0 }, *mo;
+       memberof_t              *mo;
 
        mo = (memberof_t *)ch_calloc( 1, sizeof( memberof_t ) );