X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fadd.c;h=196a3189d5fd7b90d85bb7d14f347d0605e45481;hb=8743c05359d008eab5d65d5aacf1836bd583dafb;hp=e2438a5d3ba713d160efe1fdb53155a5f5e1d1e6;hpb=e9c2895472d41da41fee1ffb049195b190f6adbc;p=openldap diff --git a/servers/slapd/add.c b/servers/slapd/add.c index e2438a5d3b..196a3189d5 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -20,13 +20,13 @@ #include "slap.h" -static void add_created_attrs(Operation *op, Entry *e); +static int add_created_attrs(Operation *op, Entry *e); int do_add( Connection *conn, Operation *op ) { BerElement *ber = op->o_ber; - char *dn, *last; + char *dn, *ndn, *last; ber_len_t len; ber_tag_t tag; Entry *e; @@ -38,7 +38,7 @@ do_add( Connection *conn, Operation *op ) if( op->o_bind_in_progress ) { Debug( LDAP_DEBUG_ANY, "do_add: SASL bind in progress.\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_SASL_BIND_IN_PROGRESS, NULL, - "SASL bind in progress" ); + "SASL bind in progress", NULL, NULL ); return LDAP_SASL_BIND_IN_PROGRESS; } @@ -62,10 +62,21 @@ do_add( Connection *conn, Operation *op ) return -1; } + ndn = ch_strdup( dn ); + + if ( dn_normalize_case( ndn ) == NULL ) { + Debug( LDAP_DEBUG_ANY, "do_add: invalid dn (%s)\n", dn, 0, 0 ); + send_ldap_result( conn, op, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid DN", NULL, NULL ); + free( dn ); + free( ndn ); + return LDAP_INVALID_DN_SYNTAX; + } + e = (Entry *) ch_calloc( 1, sizeof(Entry) ); e->e_dn = dn; - e->e_ndn = dn_normalize_case( ch_strdup( dn ) ); + e->e_ndn = ndn; e->e_private = NULL; dn = NULL; @@ -89,8 +100,8 @@ do_add( Connection *conn, Operation *op ) if ( vals == NULL ) { Debug( LDAP_DEBUG_ANY, "no values for type %s\n", type, 0, 0 ); - send_ldap_result( conn, op, - LDAP_PROTOCOL_ERROR, NULL, "no values for type" ); + send_ldap_result( conn, op, LDAP_PROTOCOL_ERROR, + NULL, "no values for type", NULL, NULL ); free( type ); entry_free( e ); return LDAP_PROTOCOL_ERROR; @@ -117,7 +128,7 @@ do_add( Connection *conn, Operation *op ) } Statslog( LDAP_DEBUG_STATS, "conn=%d op=%d ADD dn=\"%s\"\n", - conn->c_connid, op->o_opid, e->e_ndn, 0, 0 ); + op->o_connid, op->o_opid, e->e_ndn, 0, 0 ); /* * We could be serving multiple database backends. Select the @@ -127,8 +138,8 @@ do_add( Connection *conn, Operation *op ) be = select_backend( e->e_ndn ); if ( be == NULL ) { entry_free( e ); - send_ldap_result( conn, op, LDAP_PARTIAL_RESULTS, NULL, - default_referral ); + send_ldap_result( conn, op, LDAP_REFERRAL, NULL, + NULL, default_referral, NULL ); return rc; } @@ -144,37 +155,46 @@ do_add( Connection *conn, Operation *op ) strcmp( be->be_update_ndn, op->o_ndn ) == 0 ) { if ( (be->be_lastmod == ON || (be->be_lastmod == UNDEFINED && - global_lastmod == ON)) && be->be_update_ndn == NULL ) { - - add_created_attrs( op, e ); + global_lastmod == ON)) && be->be_update_ndn == NULL ) + { + rc = add_created_attrs( op, e ); + + if( rc != LDAP_SUCCESS ) { + entry_free( e ); + send_ldap_result( conn, op, rc, + NULL, "no-user-modification attribute type", + NULL, NULL ); + return rc; + } } + if ( (*be->be_add)( be, conn, op, e ) == 0 ) { - replog( be, LDAP_REQ_ADD, e->e_dn, e, 0 ); + replog( be, op, e->e_dn, e ); be_entry_release_w( be, e ); } } else { entry_free( e ); - send_ldap_result( conn, op, rc = LDAP_PARTIAL_RESULTS, NULL, - default_referral ); + send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, + be->be_update_refs ? be->be_update_refs : default_referral, NULL ); } } else { Debug( LDAP_DEBUG_ARGS, " do_add: HHH\n", 0, 0, 0 ); entry_free( e ); - send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM, NULL, - "Function not implemented" ); + send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM, + NULL, "Function not implemented", NULL, NULL ); } return rc; } -static void +static int add_created_attrs( Operation *op, Entry *e ) { char buf[22]; struct berval bv; struct berval *bvals[2]; - Attribute **a, **next; + Attribute *a; Attribute *tmp; struct tm *ltm; time_t currenttime; @@ -184,15 +204,10 @@ add_created_attrs( Operation *op, Entry *e ) bvals[0] = &bv; bvals[1] = NULL; - /* remove any attempts by the user to add these attrs */ - for ( a = &e->e_attrs; *a != NULL; a = next ) { - if ( oc_check_no_usermod_attr( (*a)->a_type ) ) { - tmp = *a; - *a = (*a)->a_next; - attr_free( tmp ); - next = a; - } else { - next = &(*a)->a_next; + /* return error on any attempts by the user to add these attrs */ + for ( a = e->e_attrs; a != NULL; a = a->a_next ) { + if ( oc_check_no_usermod_attr( a->a_type ) ) { + return LDAP_CONSTRAINT_VIOLATION; } } @@ -219,4 +234,6 @@ add_created_attrs( Operation *op, Entry *e ) bv.bv_val = buf; bv.bv_len = strlen( bv.bv_val ); attr_merge( e, "createtimestamp", bvals ); + + return LDAP_SUCCESS; }