X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=inline;f=servers%2Fslapd%2Fmodify.c;h=1405ca9c7201c0d5aca34333748160195efa7ff7;hb=592e05e3e1a64f03151eeb9284d48b7a26823242;hp=40529e4a81164a17457a120cc135aaf08dea9ae1;hpb=130f6e1b7d6f6c76e2e2749c4e8a18b48e27c978;p=openldap diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index 40529e4a81..1405ca9c72 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -150,7 +150,8 @@ do_modify( default: { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, - "do_modify: invalid modify operation (%ld)\n", (long)mop, 0, 0 ); + "do_modify: invalid modify operation (%ld)\n", + (long)mop, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: invalid modify operation (%ld)\n", @@ -177,7 +178,8 @@ do_modify( goto cleanup; } - rs->sr_err = dnPrettyNormal( NULL, &dn, &op->o_req_dn, &op->o_req_ndn, op->o_tmpmemctx ); + rs->sr_err = dnPrettyNormal( NULL, &dn, &op->o_req_dn, &op->o_req_ndn, + op->o_tmpmemctx ); if( rs->sr_err != LDAP_SUCCESS ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_modify: conn %d invalid dn (%s)\n", @@ -296,15 +298,21 @@ do_modify( * appropriate one, or send a referral to our "referral server" * if we don't hold it. */ - if ( (op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 )) == NULL ) { + op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 ); + if ( op->o_bd == NULL ) { rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); if (!rs->sr_ref) rs->sr_ref = default_referral; - rs->sr_err = LDAP_REFERRAL; - send_ldap_result( op, rs ); + if (rs->sr_ref != NULL ) { + rs->sr_err = LDAP_REFERRAL; + send_ldap_result( op, rs ); - if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref ); + if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref ); + } else { + send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, + "referral missing" ); + } goto cleanup; } @@ -327,7 +335,7 @@ do_modify( slapi_pblock_set( pb, SLAPI_MODIFY_MODS, (void *)modv ); rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODIFY_FN, pb ); - if ( rs->sr_err != 0 ) { + if ( rs->sr_err < 0 ) { /* * A preoperation plugin failure will abort the * entire operation. @@ -339,7 +347,8 @@ do_modify( Debug(LDAP_DEBUG_TRACE, "do_modify: modify preoperation plugin failed.\n", 0, 0, 0); #endif - if ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0) { + if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { rs->sr_err = LDAP_OTHER; } slapi_x_free_ldapmods( modv ); @@ -382,10 +391,16 @@ do_modify( if ( op->o_bd->be_modify ) { /* do the update here */ int repl_user = be_isupdate( op->o_bd, &op->o_ndn ); -#ifndef SLAPD_MULTIMASTER + /* Multimaster slapd does not have to check for replicator dn * because it accepts each modify request */ +#if defined(LDAP_SYNCREPL) && !defined(SLAPD_MULTIMASTER) + if ( !op->o_bd->syncinfo && + ( !op->o_bd->be_update_ndn.bv_len || repl_user )) +#elif defined(LDAP_SYNCREPL) && defined(SLAPD_MULTIMASTER) + if ( !op->o_bd->syncinfo ) /* LDAP_SYNCREPL overrides MM */ +#elif !defined(LDAP_SYNCREPL) && !defined(SLAPD_MULTIMASTER) if ( !op->o_bd->be_update_ndn.bv_len || repl_user ) #endif { @@ -427,18 +442,34 @@ do_modify( replog( op ); } -#ifndef SLAPD_MULTIMASTER +#if defined(LDAP_SYNCREPL) || !defined(SLAPD_MULTIMASTER) /* send a referral */ } else { - BerVarray defref = op->o_bd->be_update_refs - ? op->o_bd->be_update_refs : default_referral; - rs->sr_ref = referral_rewrite( defref, - NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); - - if (!rs->sr_ref) rs->sr_ref = defref; - rs->sr_err = LDAP_REFERRAL; - send_ldap_result( op, rs ); - if (rs->sr_ref != defref) ber_bvarray_free( rs->sr_ref ); + BerVarray defref = NULL; +#ifdef LDAP_SYNCREPL + if ( op->o_bd->syncinfo ) { + defref = op->o_bd->syncinfo->master_bv; + } else +#endif + { + defref = op->o_bd->be_update_refs + ? op->o_bd->be_update_refs : default_referral; + } + if ( defref != NULL ) { + rs->sr_ref = referral_rewrite( defref, + NULL, &op->o_req_dn, + LDAP_SCOPE_DEFAULT ); + if (!rs->sr_ref) rs->sr_ref = defref; + rs->sr_err = LDAP_REFERRAL; + send_ldap_result( op, rs ); + if (rs->sr_ref != defref) { + ber_bvarray_free( rs->sr_ref ); + } + } else { + send_ldap_error( op, rs, + LDAP_UNWILLING_TO_PERFORM, + "referral missing" ); + } #endif } } else { @@ -447,7 +478,7 @@ do_modify( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODIFY_FN, pb ) != 0 ) { + if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODIFY_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_modify: modify postoperation plugins " "failed\n", 0, 0, 0 ); @@ -615,7 +646,9 @@ int slap_mods_check( if( nvals && ad->ad_type->sat_equality && ad->ad_type->sat_equality->smr_normalize ) { - ml->sml_nvalues = ber_memalloc_x( (nvals+1)*sizeof(struct berval), ctx ); + ml->sml_nvalues = ber_memalloc_x( + (nvals+1)*sizeof(struct berval), ctx ); + for( nvals = 0; ml->sml_values[nvals].bv_val; nvals++ ) { rc = ad->ad_type->sat_equality->smr_normalize( 0, @@ -639,8 +672,11 @@ int slap_mods_check( return rc; } } + ml->sml_nvalues[nvals].bv_val = NULL; ml->sml_nvalues[nvals].bv_len = 0; + + } else { } } }