X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fadd.c;h=e45ded2ae6a9dd06483bc095b39a54bf3c952399;hb=517fa54bb0f764968ca56e7931a09adac4f33af6;hp=b9b2c63f7e63ea0bcba743ef7f04d91b708f528d;hpb=b7d1b10bca392750165438c480d11ecf75771079;p=openldap diff --git a/servers/slapd/add.c b/servers/slapd/add.c index b9b2c63f7e..e45ded2ae6 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -18,7 +18,6 @@ #include "portable.h" #include - #include #include #include @@ -134,8 +133,7 @@ do_add( Connection *conn, Operation *op ) goto done; } - if ( modlist == NULL ) - { + if ( modlist == NULL ) { send_ldap_result( conn, op, rc = LDAP_PROTOCOL_ERROR, NULL, "no attributes provided", NULL, NULL ); goto done; @@ -158,13 +156,18 @@ do_add( Connection *conn, Operation *op ) /* make sure this backend recongizes critical controls */ rc = backend_check_controls( be, conn, op, &text ) ; - if( rc != LDAP_SUCCESS ) { send_ldap_result( conn, op, rc, NULL, text, NULL, NULL ); goto done; } + /* check for referrals */ + rc = backend_check_referrals( be, conn, op, e->e_dn, e->e_ndn ); + if ( rc != LDAP_SUCCESS ) { + goto done; + } + if ( global_readonly || be->be_readonly ) { Debug( LDAP_DEBUG_ANY, "do_add: database is read-only\n", 0, 0, 0 ); @@ -282,8 +285,34 @@ static int slap_mods2entry( attr = attr_find( (*e)->e_attrs, mods->sml_desc ); if( attr != NULL ) { +#define SLURPD_FRIENDLY +#ifdef SLURPD_FRIENDLY + ber_len_t i,j; + + for( i=0; attr->a_vals[i]; i++ ) { + /* count them */ + } + for( j=0; mods->sml_bvalues[j]; j++ ) { + /* count them */ + } + j++; /* NULL */ + + attr->a_vals = ch_realloc( attr->a_vals, + sizeof( struct berval * ) * (i+j) ); + + /* should check for duplicates */ + memcpy( &attr->a_vals[i], mods->sml_bvalues, + sizeof( struct berval * ) * j ); + + /* trim the mods array */ + ch_free( mods->sml_bvalues ); + mods->sml_bvalues = NULL; + + continue; +#else *text = "attribute provided more than once"; - return LDAP_OPERATIONS_ERROR; + return LDAP_TYPE_OR_VALUE_EXISTS; +#endif } attr = ch_calloc( 1, sizeof(Attribute) );