]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
fix ITS#3753
[openldap] / servers / slapd / add.c
index 5154acfbc990df1017b14d8fa53d491efe844197..39480b5c932bc3e1547531581a98860ab86b7e8e 100644 (file)
@@ -177,11 +177,7 @@ do_add( Operation *op, SlapReply *rs )
        op->o_bd = frontendDB;
        rc = frontendDB->be_add( op, rs );
        if ( rc == 0 ) {
-               /* FIXME: temporary? */
-               assert( op->ora_e != NULL );
-               assert( op->o_private != NULL );
-               
-               if ( op->ora_e != NULL ) {
+               if ( op->ora_e != NULL && op->o_private != NULL ) {
                        BackendDB       *bd = op->o_bd;
 
                        op->o_bd = (BackendDB *)op->o_private;
@@ -218,6 +214,8 @@ fe_op_add( Operation *op, SlapReply *rs )
        Modifications   **modtail = &modlist;
        int             rc = 0;
        BackendDB *op_be;
+       char            textbuf[ SLAP_TEXT_BUFLEN ];
+       size_t          textlen = sizeof( textbuf );
 
        manageDSAit = get_manageDSAit( op );
 
@@ -266,6 +264,14 @@ fe_op_add( Operation *op, SlapReply *rs )
                goto done;
        }
 
+       rs->sr_err = slap_mods_obsolete_check( op, modlist,
+               &rs->sr_text, textbuf, textlen );
+
+       if ( rs->sr_err != LDAP_SUCCESS ) {
+               send_ldap_result( op, rs );
+               goto done;
+       }
+
 #ifdef LDAP_SLAPI
        if ( op->o_pb ) init_add_pblock( op, &op->o_req_dn, op->ora_e, manageDSAit );
 #endif /* LDAP_SLAPI */
@@ -284,16 +290,13 @@ fe_op_add( Operation *op, SlapReply *rs )
 #endif
                {
                        int             update = !BER_BVISEMPTY( &op->o_bd->be_update_ndn );
-                       char            textbuf[ SLAP_TEXT_BUFLEN ];
-                       size_t          textlen = sizeof( textbuf );
                        slap_callback   cb = { NULL, slap_replog_cb, NULL, NULL };
 
                        op->o_bd = op_be;
 
                        if ( !update ) {
-                               rs->sr_err = slap_mods_no_update_check( modlist,
-                                               &rs->sr_text,
-                                               textbuf, textlen );
+                               rs->sr_err = slap_mods_no_user_mod_check( op, modlist,
+                                       &rs->sr_text, textbuf, textlen );
 
                                if ( rs->sr_err != LDAP_SUCCESS ) {
                                        send_ldap_result( op, rs );
@@ -508,56 +511,34 @@ slap_mods2entry(
 
                if( mods->sml_values[1].bv_val != NULL ) {
                        /* check for duplicates */
-                       int             i, j;
+                       int             i, j, rc, match;
                        MatchingRule *mr = mods->sml_desc->ad_type->sat_equality;
 
-                       /* check if the values we're adding already exist */
-                       if( mr == NULL || !mr->smr_match ) {
-                               for ( i = 1; mods->sml_values[i].bv_val != NULL; i++ ) {
-                                       /* test asserted values against themselves */
-                                       for( j = 0; j < i; j++ ) {
-                                               if ( bvmatch( &mods->sml_values[i],
-                                                       &mods->sml_values[j] ) )
-                                               {
-                                                       /* value exists already */
-                                                       snprintf( textbuf, textlen,
-                                                               "%s: value #%d provided more than once",
-                                                               mods->sml_desc->ad_cname.bv_val, j );
-                                                       return LDAP_TYPE_OR_VALUE_EXISTS;
-                                               }
-                                       }
-                               }
-
-                       } else {
-                               int     rc;
-                               int match;
-
-                               for ( i = 1; mods->sml_values[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_ATTRIBUTE_SYNTAX
-                                                       | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
-                                                       | SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
-                                                       mods->sml_nvalues
-                                                               ? &mods->sml_nvalues[i]
-                                                               : &mods->sml_values[i],
-                                                       mods->sml_nvalues
-                                                               ? &mods->sml_nvalues[j]
-                                                               : &mods->sml_values[j],
-                                                       text );
-
-                                               if ( rc == LDAP_SUCCESS && match == 0 ) {
-                                                       /* value exists already */
-                                                       snprintf( textbuf, textlen,
-                                                               "%s: value #%d provided more than once",
-                                                               mods->sml_desc->ad_cname.bv_val, j );
-                                                       return LDAP_TYPE_OR_VALUE_EXISTS;
-
-                                               } else if ( rc != LDAP_SUCCESS ) {
-                                                       return rc;
-                                               }
+                       for ( i = 1; mods->sml_values[i].bv_val != NULL; i++ ) {
+                               /* test asserted values against themselves */
+                               for( j = 0; j < i; j++ ) {
+                                       rc = ordered_value_match( &match, mods->sml_desc, mr,
+                                               SLAP_MR_EQUALITY
+                                               | SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
+                                               | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
+                                               | SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
+                                               mods->sml_nvalues
+                                                       ? &mods->sml_nvalues[i]
+                                                       : &mods->sml_values[i],
+                                               mods->sml_nvalues
+                                                       ? &mods->sml_nvalues[j]
+                                                       : &mods->sml_values[j],
+                                               text );
+
+                                       if ( rc == LDAP_SUCCESS && match == 0 ) {
+                                               /* value exists already */
+                                               snprintf( textbuf, textlen,
+                                                       "%s: value #%d provided more than once",
+                                                       mods->sml_desc->ad_cname.bv_val, j );
+                                               return LDAP_TYPE_OR_VALUE_EXISTS;
+
+                                       } else if ( rc != LDAP_SUCCESS ) {
+                                               return rc;
                                        }
                                }
                        }