]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/modify.c
fix RID format
[openldap] / servers / slapd / modify.c
index cb91b3015eb4fbe77c36b2ca64d77217eb2572ac..f84026220864d369fd6276fadf76659b3f2e2736 100644 (file)
@@ -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 );