send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
NULL, "modify upon the root DSE not supported", NULL, NULL );
goto cleanup;
+
+#if defined( SLAPD_SCHEMA_DN )
+ } else if ( strcasecmp( ndn, SLAPD_SCHEMA_DN ) == 0 ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
+ "do_modify: attempt to modify subschema subentry.\n" ));
+#else
+ Debug( LDAP_DEBUG_ANY, "do_modify: subschema subentry!\n", 0, 0, 0 );
+#endif
+
+ send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
+ NULL, "modification of subschema subentry not supported",
+ NULL, NULL );
+ goto cleanup;
+#endif
}
#ifdef LDAP_DEBUG
* if we don't hold it.
*/
if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
+ struct berval **ref = referral_rewrite( default_referral,
+ NULL, dn, LDAP_SCOPE_DEFAULT );
+
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
- NULL, NULL, default_referral, NULL );
+ NULL, NULL, ref ? ref : default_referral, NULL );
+
+ ber_bvecfree( ref );
goto cleanup;
}
*/
if ( be->be_modify ) {
/* do the update here */
- int repl_user = (be->be_update_ndn != NULL &&
- strcmp( be->be_update_ndn, op->o_ndn ) == 0);
+ int repl_user = be_isupdate( be, op->o_ndn );
#ifndef SLAPD_MULTIMASTER
/* Multimaster slapd does not have to check for replicator dn
* because it accepts each modify request
#ifndef SLAPD_MULTIMASTER
/* send a referral */
} else {
+ struct berval **defref = be->be_update_refs
+ ? be->be_update_refs : default_referral;
+ struct berval **ref = referral_rewrite( defref,
+ NULL, dn, LDAP_SCOPE_DEFAULT );
+
send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
- be->be_update_refs ? be->be_update_refs : default_referral,
- NULL );
+ ref ? ref : defref, NULL );
+
+ ber_bvecfree( ref );
#endif
}
} else {
if( rc != 0 ) {
slap_mods_free( mod );
snprintf( textbuf, textlen,
- "%s: value #%ld contains invalid data",
+ "%s: value #%ld invalid per syntax",
ml->ml_type, (long) nvals );
*text = textbuf;
return LDAP_INVALID_SYNTAX;
if( op->o_tag == LDAP_REQ_ADD ) {
mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
mod->sml_op = mop;
- mod->sml_desc = ad_dup( slap_schema.si_ad_creatorsName );
+ mod->sml_desc = slap_schema.si_ad_creatorsName;
mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
mod->sml_bvalues[0] = ber_bvdup( &name );
mod->sml_bvalues[1] = NULL;
-
+ assert( mod->sml_bvalues[0] );
*modtail = mod;
modtail = &mod->sml_next;
mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
mod->sml_op = mop;
- mod->sml_desc = ad_dup( slap_schema.si_ad_createTimestamp );
+ mod->sml_desc = slap_schema.si_ad_createTimestamp;
mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
mod->sml_bvalues[0] = ber_bvdup( ×tamp );
mod->sml_bvalues[1] = NULL;
+ assert( mod->sml_bvalues[0] );
*modtail = mod;
modtail = &mod->sml_next;
}
mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
mod->sml_op = mop;
- mod->sml_desc = ad_dup( slap_schema.si_ad_modifiersName );
+ mod->sml_desc = slap_schema.si_ad_modifiersName;
mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
mod->sml_bvalues[0] = ber_bvdup( &name );
mod->sml_bvalues[1] = NULL;
+ assert( mod->sml_bvalues[0] );
*modtail = mod;
modtail = &mod->sml_next;
mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
mod->sml_op = mop;
- mod->sml_desc = ad_dup( slap_schema.si_ad_modifyTimestamp );
+ mod->sml_desc = slap_schema.si_ad_modifyTimestamp;
mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
mod->sml_bvalues[0] = ber_bvdup( ×tamp );
mod->sml_bvalues[1] = NULL;
+ assert( mod->sml_bvalues[0] );
*modtail = mod;
modtail = &mod->sml_next;