From 6390e947b0d9f9376d1794c32e356677a659694b Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 25 Feb 2003 22:49:41 +0000 Subject: [PATCH] SLAP_NVALUES, round 2 --- servers/slapd/add.c | 23 +++++-- servers/slapd/attr.c | 17 ++++-- servers/slapd/back-bdb/passwd.c | 5 +- servers/slapd/entry.c | 34 ++++++++++- servers/slapd/modify.c | 105 ++++++++++++++++++++------------ servers/slapd/modrdn.c | 18 ++++-- servers/slapd/operational.c | 9 +++ servers/slapd/slap.h | 6 +- 8 files changed, 156 insertions(+), 61 deletions(-) diff --git a/servers/slapd/add.c b/servers/slapd/add.c index d0b393d364..b023b9f429 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -113,7 +113,11 @@ do_add( Connection *conn, Operation *op ) Modifications *mod; ber_tag_t rtag; - rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_bvalues ); +#ifdef SLAP_NVALUES + tmp.sml_nvalues = NULL; +#endif + + rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_values ); if ( rtag == LBER_ERROR ) { #ifdef NEW_LOGGING @@ -128,7 +132,7 @@ do_add( Connection *conn, Operation *op ) goto done; } - if ( tmp.sml_bvalues == NULL ) { + if ( tmp.sml_values == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_add: conn %d no values for type %s\n", @@ -141,13 +145,16 @@ do_add( Connection *conn, Operation *op ) NULL, "no values for attribute type", NULL, NULL ); goto done; } + mod = (Modifications *) ch_malloc( sizeof(Modifications) ); - mod->sml_op = LDAP_MOD_ADD; mod->sml_next = NULL; mod->sml_desc = NULL; mod->sml_type = tmp.sml_type; - mod->sml_bvalues = tmp.sml_bvalues; + mod->sml_values = tmp.sml_values; +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif *modtail = mod; modtail = &mod->sml_next; @@ -476,8 +483,12 @@ slap_mods2entry( /* move values to attr structure */ /* should check for duplicates */ - attr->a_vals = mods->sml_bvalues; - mods->sml_bvalues = NULL; + attr->a_vals = mods->sml_values; + mods->sml_values = NULL; +#ifdef SLAP_NVALUES + attr->a_nvals = mods->sml_nvalues; + mods->sml_nvalues = NULL; +#endif *tail = attr; tail = &attr->a_next; diff --git a/servers/slapd/attr.c b/servers/slapd/attr.c index 047c926762..d72c5ae092 100644 --- a/servers/slapd/attr.c +++ b/servers/slapd/attr.c @@ -66,21 +66,30 @@ Attribute *attr_dup( Attribute *a ) tmp->a_vals = ch_malloc((i+1) * sizeof(struct berval)); #ifdef SLAP_NVALUES - tmp->a_nvals = ch_malloc((i+1) * sizeof(struct berval)); + if( a->a_nvals != NULL ) { + tmp->a_nvals = ch_malloc((i+1) * sizeof(struct berval)); + } #endif for( i=0; a->a_vals[i].bv_val != NULL; i++ ) { ber_dupbv( &tmp->a_vals[i], &a->a_vals[i] ); if( tmp->a_vals[i].bv_val == NULL ) break; + #ifdef SLAP_NVALUES - ber_dupbv( &tmp->a_nvals[i], &a->a_nvals[i] ); - if( tmp->a_nvals[i].bv_val == NULL ) break; + if( a->a_nvals ) { + ber_dupbv( &tmp->a_nvals[i], &a->a_nvals[i] ); + if( tmp->a_nvals[i].bv_val == NULL ) break; + } else { + tmp->a_nvals = NULL; + } #endif } tmp->a_vals[i].bv_val = NULL; #ifdef SLAP_NVALUES - tmp->a_nvals[i].bv_val = NULL; + if( tmp->a_nvals != NULL ) { + tmp->a_nvals[i].bv_val = NULL; + } #endif } else { diff --git a/servers/slapd/back-bdb/passwd.c b/servers/slapd/back-bdb/passwd.c index 7f153e80bd..9a8efdfe76 100644 --- a/servers/slapd/back-bdb/passwd.c +++ b/servers/slapd/back-bdb/passwd.c @@ -215,7 +215,10 @@ retry: /* transaction retry */ vals[1].bv_val = NULL; ml.sml_desc = slap_schema.si_ad_userPassword; - ml.sml_bvalues = vals; + ml.sml_values = vals; +#ifdef SLAP_VALUES + ml.sml_nvalues = vals; +#endif ml.sml_op = LDAP_MOD_REPLACE; ml.sml_next = NULL; diff --git a/servers/slapd/entry.c b/servers/slapd/entry.c index 51d352fb11..23d58ed758 100644 --- a/servers/slapd/entry.c +++ b/servers/slapd/entry.c @@ -24,7 +24,9 @@ static int emaxsize;/* max size of ebuf */ /* * Empty root entry */ -const Entry slap_entry_root = { NOID, { 0, "" }, { 0, "" }, NULL, 0, { 0, "" }, NULL }; +const Entry slap_entry_root = { + NOID, { 0, "" }, { 0, "" }, NULL, 0, { 0, "" }, NULL +}; int entry_destroy(void) { @@ -237,7 +239,33 @@ str2entry( char *s ) } #ifdef SLAP_NVALUES - /* normalize here */ + if( ad->ad_type->sat_syntax->ssyn_normalize ) { + rc = ad->ad_type->sat_syntax->ssyn_normalize( + ad->ad_type->sat_syntax, + &vals[0], &nvals[0] ); + + if( rc ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, DETAIL1, + "str2entry: NULL (ssyn_normalize %d)\n" , rc, 0, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "<= str2entry NULL (ssyn_normalize %d)\n", rc, 0, 0 ); + + entry_free( e ); + free( vals[0].bv_val ); + free( type ); + return NULL; + } +#endif + + } else { + nvals[0].bv_len = 0; + nvals[0].bv_val = NULL; + } + + nvals[1].bv_len = 0; + nvals[1].bv_val = NULL; #endif rc = attr_merge( e, ad, vals @@ -276,7 +304,7 @@ str2entry( char *s ) (long) e->e_id, 0, 0 ); #endif entry_free( e ); - return( NULL ); + return NULL; } #ifdef NEW_LOGGING diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index 44c9da2be8..c3a2763d96 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -109,9 +109,12 @@ do_modify( ber_int_t mop; Modifications tmp, *mod; +#ifdef SLAP_NVALUES + tmp.sml_nvalues = NULL; +#endif if ( ber_scanf( op->o_ber, "{i{m[W]}}", &mop, - &tmp.sml_type, &tmp.sml_bvalues ) + &tmp.sml_type, &tmp.sml_values ) == LBER_ERROR ) { send_ldap_disconnect( conn, op, @@ -123,14 +126,17 @@ do_modify( mod = (Modifications *) ch_malloc( sizeof(Modifications) ); mod->sml_op = mop; mod->sml_type = tmp.sml_type; - mod->sml_bvalues = tmp.sml_bvalues; + mod->sml_values = tmp.sml_values; +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif mod->sml_desc = NULL; mod->sml_next = NULL; *modtail = mod; switch( mop ) { case LDAP_MOD_ADD: - if ( mod->sml_bvalues == NULL ) { + if ( mod->sml_values == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, "do_modify: modify/add operation (%ld) requires values\n", @@ -239,11 +245,11 @@ do_modify( "add" : (tmp->sml_op == LDAP_MOD_DELETE ? "delete" : "replace"), tmp->sml_type.bv_val, 0 ); - if ( tmp->sml_bvalues == NULL ) { + if ( tmp->sml_values == NULL ) { LDAP_LOG( OPERATION, DETAIL1, "\t\tno values", 0, 0, 0 ); - } else if ( tmp->sml_bvalues[0].bv_val == NULL ) { + } else if ( tmp->sml_values[0].bv_val == NULL ) { LDAP_LOG( OPERATION, DETAIL1, "\t\tzero values", 0, 0, 0 ); - } else if ( tmp->sml_bvalues[1].bv_val == NULL ) { + } else if ( tmp->sml_values[1].bv_val == NULL ) { LDAP_LOG( OPERATION, DETAIL1, "\t\tone value", 0, 0, 0 ); } else { LDAP_LOG( OPERATION, DETAIL1, "\t\tmultiple values", 0, 0, 0 ); @@ -255,15 +261,15 @@ do_modify( ? "add" : (tmp->sml_op == LDAP_MOD_DELETE ? "delete" : "replace"), tmp->sml_type.bv_val, 0 ); - if ( tmp->sml_bvalues == NULL ) { + if ( tmp->sml_values == NULL ) { Debug( LDAP_DEBUG_ARGS, "%s\n", "\t\tno values", NULL, NULL ); - } else if ( tmp->sml_bvalues[0].bv_val == NULL ) { + } else if ( tmp->sml_values[0].bv_val == NULL ) { Debug( LDAP_DEBUG_ARGS, "%s\n", "\t\tzero values", NULL, NULL ); - } else if ( tmp->sml_bvalues[1].bv_val == NULL ) { + } else if ( tmp->sml_values[1].bv_val == NULL ) { Debug( LDAP_DEBUG_ARGS, "%s, length %ld\n", - "\t\tone value", (long) tmp->sml_bvalues[0].bv_len, NULL ); + "\t\tone value", (long) tmp->sml_values[0].bv_len, NULL ); } else { Debug( LDAP_DEBUG_ARGS, "%s\n", "\t\tmultiple values", NULL, NULL ); @@ -540,7 +546,7 @@ int slap_mods_check( } if ( is_at_obsolete( ad->ad_type ) && - ( ml->sml_op == LDAP_MOD_ADD || ml->sml_bvalues != NULL ) ) + ( ml->sml_op == LDAP_MOD_ADD || ml->sml_values != NULL ) ) { /* * attribute is obsolete, @@ -676,10 +682,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_structuralObjectClass; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &tmpval ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], &tmpval ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; } @@ -694,10 +703,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_entryUUID; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &tmpval ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], &tmpval ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; @@ -705,10 +717,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_creatorsName; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &name ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], &name ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; @@ -716,10 +731,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_createTimestamp; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], ×tamp ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], ×tamp ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; } @@ -730,10 +748,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_entryCSN; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &csn ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], &csn ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; @@ -741,10 +762,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_modifiersName; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &name ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], &name ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; @@ -752,10 +776,13 @@ int slap_mods_opattrs( mod->sml_op = mop; mod->sml_type.bv_val = NULL; mod->sml_desc = slap_schema.si_ad_modifyTimestamp; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], ×tamp ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); +#ifdef SLAP_NVALUES + mod->sml_nvalues = NULL; +#endif + mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_values[0], ×tamp ); + mod->sml_values[1].bv_val = NULL; + assert( mod->sml_values[0].bv_val ); *modtail = mod; modtail = &mod->sml_next; } diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index d2c11b96b1..5c33b348bc 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -490,9 +490,12 @@ slap_modrdn2mods( mod_tmp = ( Modifications * )ch_malloc( sizeof( Modifications ) + 2 * sizeof( struct berval ) ); mod_tmp->sml_desc = desc; - mod_tmp->sml_bvalues = ( BerVarray )( mod_tmp + 1 ); - mod_tmp->sml_bvalues[ 0 ] = new_rdn[ 0 ][ a_cnt ]->la_value; - mod_tmp->sml_bvalues[ 1 ].bv_val = NULL; + mod_tmp->sml_values = ( BerVarray )( mod_tmp + 1 ); + mod_tmp->sml_values[ 0 ] = new_rdn[ 0 ][ a_cnt ]->la_value; + mod_tmp->sml_values[ 1 ].bv_val = NULL; +#ifdef SLAP_NVALUES + mod_tmp->sml_nvalues = NULL; +#endif mod_tmp->sml_op = SLAP_MOD_SOFTADD; mod_tmp->sml_next = mod; mod = mod_tmp; @@ -549,10 +552,13 @@ slap_modrdn2mods( mod_tmp = ( Modifications * )ch_malloc( sizeof( Modifications ) + 2 * sizeof ( struct berval ) ); mod_tmp->sml_desc = desc; - mod_tmp->sml_bvalues = ( BerVarray )(mod_tmp+1); - mod_tmp->sml_bvalues[ 0 ] + mod_tmp->sml_values = ( BerVarray )(mod_tmp+1); + mod_tmp->sml_values[ 0 ] = old_rdn[ 0 ][ d_cnt ]->la_value; - mod_tmp->sml_bvalues[ 1 ].bv_val = NULL; + mod_tmp->sml_values[ 1 ].bv_val = NULL; +#ifdef SLAP_NVALUES + mod_tmp->sml_nvalues = NULL; +#endif mod_tmp->sml_op = LDAP_MOD_DELETE; mod_tmp->sml_next = mod; mod = mod_tmp; diff --git a/servers/slapd/operational.c b/servers/slapd/operational.c index 603d82456c..a32a32fd9a 100644 --- a/servers/slapd/operational.c +++ b/servers/slapd/operational.c @@ -26,8 +26,13 @@ slap_operational_subschemaSubentry( Backend *be ) a->a_vals = ch_malloc( 2 * sizeof( struct berval ) ); ber_dupbv( a->a_vals, &global_schemadn ); + a->a_vals[1].bv_len = 0; a->a_vals[1].bv_val = NULL; +#ifdef SLAP_NVALUES + a->a_nvals = NULL; +#endif + a->a_next = NULL; a->a_flags = 0; @@ -58,6 +63,10 @@ slap_operational_hasSubordinate( int hs ) ber_str2bv( val, len, 1, a->a_vals ); a->a_vals[1].bv_val = NULL; +#ifdef SLAP_NVALUES + a->a_nvals = NULL; +#endif + a->a_next = NULL; a->a_flags = 0; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index e61c020e54..5a9984bcd4 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -935,8 +935,8 @@ typedef struct slap_mod { int sm_op; AttributeDescription *sm_desc; struct berval sm_type; -#define sm_bvalues sm_values BerVarray sm_values; +#define sm_bvalues sm_values #ifdef SLAP_NVALUES BerVarray sm_nvalues; #endif @@ -947,7 +947,9 @@ typedef struct slap_mod_list { #define sml_op sml_mod.sm_op #define sml_desc sml_mod.sm_desc #define sml_type sml_mod.sm_type -#define sml_bvalues sml_mod.sm_bvalues +#define sml_bvalues sml_mod.sm_values +#define sml_values sml_mod.sm_values +#define sml_nvalues sml_mod.sm_nvalues struct slap_mod_list *sml_next; } Modifications; -- 2.39.5