X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodify.c;h=f84026220864d369fd6276fadf76659b3f2e2736;hb=c3960b98d3b5fbd6ebeb200ca7799ece7b766d50;hp=cb91b3015eb4fbe77c36b2ca64d77217eb2572ac;hpb=ee9623ad0f6d45cb509d3bfb34181125cdb37d1a;p=openldap diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index cb91b3015e..f840262208 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -183,7 +183,7 @@ do_modify( goto cleanup; } - rs->sr_err = slap_mods_check( modlist, + rs->sr_err = slap_mods_check( op, modlist, &rs->sr_text, textbuf, textlen, NULL ); if ( rs->sr_err != LDAP_SUCCESS ) { @@ -539,6 +539,7 @@ slap_mods_no_repl_user_mod_check( * Do basic attribute type checking and syntax validation. */ int slap_mods_check( + Operation *op, Modifications *ml, const char **text, char *textbuf, @@ -553,6 +554,12 @@ int slap_mods_check( /* convert to attribute description */ if ( ml->sml_desc == NULL ) { rc = slap_bv2ad( &ml->sml_type, &ml->sml_desc, text ); + if( rc != LDAP_SUCCESS ) { + if ( get_no_schema_check( op )) { + rc = slap_bv2undef_ad( &ml->sml_type, &ml->sml_desc, + text, 0 ); + } + } if( rc != LDAP_SUCCESS ) { snprintf( textbuf, textlen, "%s: %s", ml->sml_type.bv_val, *text ); @@ -810,6 +817,8 @@ int slap_mods_check( #endif /* PRESERVE_ORDER */ cv = ml->sml_nvalues ? ml->sml_nvalues : ml->sml_values; + if ( ad == slap_schema.si_ad_objectClass ) + mr = NULL; /* shortcut matching */ /* record indices to preserve input ordering */ ix = slap_sl_malloc( nvals * sizeof(int), ctx ); @@ -899,13 +908,17 @@ int slap_mods_check( } } done: - j = ix[i]; + if ( i >= 0 ) + j = ix[i]; + slap_sl_free( ix, ctx ); if ( rc != LDAP_SUCCESS ) { return rc; } else if ( match == 0 ) { /* value exists already */ + assert( i >= 0 ); + assert( i < nvals ); snprintf( textbuf, textlen, "%s: value #%d provided more than once", ml->sml_desc->ad_cname.bv_val, j );