X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodify.c;h=05891b3dbef9e8be60367ff572ea9329f5105e2f;hb=18beda81a0e6b476afbef81e5fd676804142ca32;hp=c4e35be7aa2474b7a1fb0c6ad5a7dc3990d41c13;hpb=99b450dc00545d93f001f45243576fbb6041f09d;p=openldap diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index c4e35be7aa..05891b3dbe 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -169,14 +169,6 @@ do_modify( } *modtail = NULL; - if ( modlist == NULL ) { - Debug( LDAP_DEBUG_ANY, "do_modify: no modifications\n", 0, 0, 0 ); - send_ldap_error( op, rs, LDAP_PROTOCOL_ERROR, - "empty change secquence in modify operation" ); - - goto cleanup; - } - if( get_ctrls( op, rs, 1 ) != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "do_modify: get_ctrls failed\n", 0, 0, 0 ); @@ -222,13 +214,11 @@ fe_op_modify( Operation *op, SlapReply *rs ) Modifications *tmp; #endif int manageDSAit; - Modifications *modlist = op->orm_modlist; - int increment = op->orm_increment; - BackendDB *op_be; + BackendDB *op_be; char textbuf[ SLAP_TEXT_BUFLEN ]; size_t textlen = sizeof( textbuf ); - if( BER_BVISEMPTY( &op->o_req_ndn ) ) { + if ( BER_BVISEMPTY( &op->o_req_ndn ) ) { Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 ); send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, @@ -246,7 +236,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) #ifdef LDAP_DEBUG Debug( LDAP_DEBUG_ARGS, "modifications:\n", 0, 0, 0 ); - for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) { + for ( tmp = op->orm_modlist; tmp != NULL; tmp = tmp->sml_next ) { Debug( LDAP_DEBUG_ARGS, "\t%s: %s\n", tmp->sml_op == LDAP_MOD_ADD ? "add" : (tmp->sml_op == LDAP_MOD_INCREMENT ? "increment" : @@ -275,7 +265,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) Statslog( LDAP_DEBUG_STATS, "%s MOD dn=\"%s\"\n", op->o_log_prefix, op->o_req_dn.bv_val, 0, 0, 0 ); - for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) { + for ( tmp = op->orm_modlist; tmp != NULL; tmp = tmp->sml_next ) { if (len + 1 + tmp->sml_type.bv_len > sizeof(abuf)) { Statslog( LDAP_DEBUG_STATS, "%s MOD attr=%s\n", op->o_log_prefix, abuf, 0, 0, 0 ); @@ -314,15 +304,20 @@ fe_op_modify( Operation *op, SlapReply *rs ) 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; + if ( !rs->sr_ref ) { + rs->sr_ref = default_referral; + } - if (rs->sr_ref != NULL ) { + if ( rs->sr_ref != NULL ) { rs->sr_err = LDAP_REFERRAL; op->o_bd = frontendDB; send_ldap_result( op, rs ); op->o_bd = NULL; - 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 { op->o_bd = frontendDB; send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, @@ -339,17 +334,17 @@ fe_op_modify( Operation *op, SlapReply *rs ) } /* check restrictions */ - if( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) { + if ( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) { send_ldap_result( op, rs ); goto cleanup; } /* check for referrals */ - if( backend_check_referrals( op, rs ) != LDAP_SUCCESS ) { + if ( backend_check_referrals( op, rs ) != LDAP_SUCCESS ) { goto cleanup; } - rs->sr_err = slap_mods_obsolete_check( op, modlist, + rs->sr_err = slap_mods_obsolete_check( op, op->orm_modlist, &rs->sr_text, textbuf, textlen ); if ( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); @@ -357,7 +352,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) } /* check for modify/increment support */ - if( increment && !SLAP_INCREMENT( op->o_bd ) ) { + if ( op->orm_increment && !SLAP_INCREMENT( op->o_bd ) ) { send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, "modify/increment not supported in context" ); } @@ -377,7 +372,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) */ #ifndef SLAPD_MULTIMASTER if ( !SLAP_SHADOW(op->o_bd) || repl_user ) -#endif +#endif /* ! SLAPD_MULTIMASTER */ { int update = !BER_BVISEMPTY( &op->o_bd->be_update_ndn ); slap_callback cb = { NULL, slap_replog_cb, NULL, NULL }; @@ -385,7 +380,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) op->o_bd = op_be; if ( !update ) { - rs->sr_err = slap_mods_no_user_mod_check( op, modlist, + rs->sr_err = slap_mods_no_user_mod_check( op, op->orm_modlist, &rs->sr_text, textbuf, textlen ); if ( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); @@ -393,10 +388,9 @@ fe_op_modify( Operation *op, SlapReply *rs ) } } - op->orm_modlist = modlist; #ifdef SLAPD_MULTIMASTER if ( !repl_user ) -#endif +#endif /* SLAPD_MULTIMASTER */ { /* but multimaster slapd logs only the ones * not from a replicator user */ @@ -429,7 +423,7 @@ fe_op_modify( Operation *op, SlapReply *rs ) send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, "shadow context; no update referral" ); } -#endif +#endif /* ! SLAPD_MULTIMASTER */ } } else { send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, @@ -486,7 +480,9 @@ slap_mods_no_user_mod_check( size_t textlen ) { for ( ; ml != NULL; ml = ml->sml_next ) { - if ( !is_at_no_user_mod( ml->sml_desc->ad_type ) ) continue; + if ( !is_at_no_user_mod( ml->sml_desc->ad_type ) ) { + continue; + } if ( get_manageDIT( op ) ) { if ( ml->sml_desc->ad_type->sat_flags & SLAP_AT_MANAGEABLE ) { @@ -673,7 +669,7 @@ int slap_mods_check( } else { #ifdef SLAP_ORDERED_PRETTYNORM rc = ordered_value_validate( ad, - &ml->sml_values[nvals] ); + &ml->sml_values[nvals], ml->sml_op ); #else /* ! SLAP_ORDERED_PRETTYNORM */ rc = validate( ad->ad_type->sat_syntax, &ml->sml_values[nvals] ); @@ -819,7 +815,7 @@ void slap_timestamp( time_t *tm, struct berval *bv ) */ void slap_mods_opattrs( Operation *op, - Modifications *mods, + Modifications **modsp, int manage_ctxcsn ) { struct berval name, timestamp, csn = BER_BVNULL; @@ -839,11 +835,11 @@ void slap_mods_opattrs( csn = op->o_csn; } ptr = ber_bvchr( &csn, '#' ); - if ( ptr && ptr < &csn.bv_val[csn.bv_len] ) { + if ( ptr ) { timestamp.bv_len = ptr - csn.bv_val; - if ( timestamp.bv_len >= sizeof( timebuf )) + if ( timestamp.bv_len >= sizeof( timebuf )) /* ?!? */ timestamp.bv_len = sizeof( timebuf ) - 1; - strncpy( timebuf, csn.bv_val, timestamp.bv_len ); + AC_MEMCPY( timebuf, csn.bv_val, timestamp.bv_len ); timebuf[timestamp.bv_len] = '\0'; } else { time_t now = slap_get_time(); @@ -861,9 +857,8 @@ void slap_mods_opattrs( nname = op->o_ndn; } - for ( mod = mods; mod->sml_next; mod = mod->sml_next ) + for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next ) ; - modtail = &mod->sml_next; mod = (Modifications *) ch_malloc( sizeof( Modifications ) ); mod->sml_op = LDAP_MOD_REPLACE; @@ -881,7 +876,7 @@ void slap_mods_opattrs( modtail = &mod->sml_next; if ( get_manageDIT( op ) ) { - for ( mod = mods; mod != modlast; mod = mod->sml_next ) { + for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) { if ( mod->sml_desc == slap_schema.si_ad_modifiersName ) { break; } @@ -909,7 +904,7 @@ void slap_mods_opattrs( } if ( get_manageDIT( op ) ) { - for ( mod = mods; mod != modlast; mod = mod->sml_next ) { + for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) { if ( mod->sml_desc == slap_schema.si_ad_modifyTimestamp ) { break; }