X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fadd.c;h=c1557adf8e37d99aaa8a402371074722048c0b6d;hb=306795461663a6bab277205554fa4df8f9515c8a;hp=1a9bf13c01668ef86fd4acee6b250f968cf03f0e;hpb=2fdbc553746c44df7ec15c88b73d608743bfa030;p=openldap diff --git a/servers/slapd/add.c b/servers/slapd/add.c index 1a9bf13c01..c1557adf8e 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -78,7 +78,7 @@ do_add( Operation *op, SlapReply *rs ) e = (Entry *) ch_calloc( 1, sizeof(Entry) ); - rs->sr_err = dnPrettyNormal( NULL, &dn, &e->e_name, &e->e_nname ); + 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 @@ -91,6 +91,9 @@ do_add( Operation *op, SlapReply *rs ) goto done; } + ber_dupbv( &e->e_name, &op->o_req_dn ); + ber_dupbv( &e->e_nname, &op->o_req_ndn ); + #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ARGS, "do_add: conn %d dn (%s)\n", op->o_connid, e->e_dn, 0 ); @@ -98,9 +101,6 @@ do_add( Operation *op, SlapReply *rs ) Debug( LDAP_DEBUG_ARGS, "do_add: dn (%s)\n", e->e_dn, 0, 0 ); #endif - op->o_req_dn = e->e_name; - op->o_req_ndn = e->e_nname; - /* get the attrs */ for ( tag = ber_first_element( ber, &len, &last ); tag != LBER_DEFAULT; tag = ber_next_element( ber, &len, last ) ) @@ -108,9 +108,7 @@ do_add( Operation *op, SlapReply *rs ) Modifications *mod; ber_tag_t rtag; -#ifdef SLAP_NVALUES tmp.sml_nvalues = NULL; -#endif rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_values ); @@ -145,9 +143,7 @@ do_add( Operation *op, SlapReply *rs ) mod->sml_desc = NULL; mod->sml_type = tmp.sml_type; mod->sml_values = tmp.sml_values; -#ifdef SLAP_NVALUES mod->sml_nvalues = NULL; -#endif *modtail = mod; modtail = &mod->sml_next; @@ -204,12 +200,16 @@ do_add( Operation *op, SlapReply *rs ) if ( op->o_bd == NULL ) { rs->sr_ref = referral_rewrite( default_referral, NULL, &e->e_name, LDAP_SCOPE_DEFAULT ); - - rs->sr_err = LDAP_REFERRAL; if (!rs->sr_ref) rs->sr_ref = default_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 done; } @@ -246,7 +246,7 @@ do_add( Operation *op, SlapReply *rs ) size_t textlen = sizeof textbuf; rs->sr_err = slap_mods_check( modlist, update, &rs->sr_text, - textbuf, textlen ); + textbuf, textlen, NULL ); if( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); @@ -288,7 +288,7 @@ do_add( Operation *op, SlapReply *rs ) } #endif /* LDAP_SLAPI */ - op->oq_add.rs_e = e; + op->ora_e = e; if ( (op->o_bd->be_add)( op, rs ) == 0 ) { #ifdef SLAPD_MULTIMASTER if ( !repl_user ) @@ -303,7 +303,6 @@ do_add( Operation *op, SlapReply *rs ) #ifndef SLAPD_MULTIMASTER } else { BerVarray defref; - BerVarray ref; #ifdef LDAP_SLAPI /* * SLAPI_ADD_ENTRY will be empty, but this may be acceptable @@ -318,14 +317,20 @@ do_add( Operation *op, SlapReply *rs ) defref = op->o_bd->be_update_refs ? op->o_bd->be_update_refs : default_referral; - rs->sr_ref = referral_rewrite( defref, - NULL, &e->e_name, LDAP_SCOPE_DEFAULT ); - - rs->sr_err = LDAP_REFERRAL; - if (!rs->sr_ref) rs->sr_ref = default_referral; - send_ldap_result( op, rs ); + if ( defref != NULL ) { + rs->sr_ref = referral_rewrite( defref, + NULL, &e->e_name, LDAP_SCOPE_DEFAULT ); + if ( rs->sr_ref == NULL ) rs->sr_ref = defref; + rs->sr_err = LDAP_REFERRAL; + if (!rs->sr_ref) rs->sr_ref = default_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" ); + } #endif /* SLAPD_MULTIMASTER */ } } else { @@ -357,6 +362,8 @@ done: if( e != NULL ) { entry_free( e ); } + op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); + op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); return rs->sr_err; } @@ -414,7 +421,6 @@ slap_mods2entry( ch_free( mods->sml_values ); mods->sml_values = NULL; -#ifdef SLAP_NVALUES if( mods->sml_nvalues ) { attr->a_nvals = ch_realloc( attr->a_nvals, sizeof( struct berval ) * (i+j) ); @@ -428,7 +434,6 @@ slap_mods2entry( } else { attr->a_nvals = attr->a_vals; } -#endif continue; #else @@ -461,15 +466,14 @@ slap_mods2entry( } } else { - int rc; -#ifdef SLAP_NVALUES + int rc = LDAP_SUCCESS; int match; for ( i = 0; mods->sml_nvalues[i].bv_val != NULL; i++ ) { /* test asserted values against themselves */ for( j = 0; j < i; j++ ) { rc = value_match( &match, mods->sml_desc, mr, - SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ASSERTION_SYNTAX + SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH | SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH, &mods->sml_nvalues[i], &mods->sml_nvalues[j], text ); @@ -482,11 +486,6 @@ slap_mods2entry( } } } -#else - rc = modify_check_duplicates( mods->sml_desc, mr, - NULL, mods->sml_bvalues, 0, - text, textbuf, textlen ); -#endif if ( rc != LDAP_SUCCESS ) { return rc; } @@ -504,14 +503,12 @@ slap_mods2entry( attr->a_vals = mods->sml_values; mods->sml_values = NULL; -#ifdef SLAP_NVALUES if ( mods->sml_nvalues ) { attr->a_nvals = mods->sml_nvalues; mods->sml_nvalues = NULL; } else { attr->a_nvals = attr->a_vals; } -#endif *tail = attr; tail = &attr->a_next; @@ -535,7 +532,7 @@ static int doPreAddPluginFNs( Operation *op ) int rc; rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_ADD_FN, op->o_pb ); - if ( rc != 0 ) { + if ( rc < 0 ) { /* * A preoperation plugin failure will abort the * entire operation. @@ -561,12 +558,12 @@ static void doPostAddPluginFNs( Operation *op ) int rc; rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_ADD_FN, op->o_pb ); - if ( rc != 0 ) { + if ( rc < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_add: add postoperation plugin failed\n", 0, 0, 0); #else - Debug(LDAP_DEBUG_TRACE, "do_add: add preoperation plugin failed.\n", + Debug(LDAP_DEBUG_TRACE, "do_add: add postoperation plugin failed.\n", 0, 0, 0); #endif }