From: Pierangelo Masarati Date: Fri, 11 Jan 2008 19:32:01 +0000 (+0000) Subject: fix str2entry2() when there is no attrs (ITS#5308) X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~218 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ae665d0d3dda589d0ed864f783daec403777b35a;p=openldap fix str2entry2() when there is no attrs (ITS#5308) --- diff --git a/servers/slapd/entry.c b/servers/slapd/entry.c index b884404615..fa30a1ee69 100644 --- a/servers/slapd/entry.c +++ b/servers/slapd/entry.c @@ -241,155 +241,157 @@ str2entry2( char *s, int checkvals ) } } - for ( i=0; i<=lines; i++ ) { - ad_prev = ad; - if ( !ad || ( iad_cname ))) { - ad = NULL; - rc = slap_bv2ad( type+i, &ad, &text ); - - if( rc != LDAP_SUCCESS ) { - Debug( slapMode & SLAP_TOOL_MODE - ? LDAP_DEBUG_ANY : LDAP_DEBUG_TRACE, - "<= str2entry: str2ad(%s): %s\n", type[i].bv_val, text, 0 ); - if( slapMode & SLAP_TOOL_MODE ) { - goto fail; - } - - rc = slap_bv2undef_ad( type+i, &ad, &text, 0 ); + if ( lines > 0 ) { + for ( i=0; i<=lines; i++ ) { + ad_prev = ad; + if ( !ad || ( iad_cname ))) { + ad = NULL; + rc = slap_bv2ad( type+i, &ad, &text ); + if( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_ANY, - "<= str2entry: slap_str2undef_ad(%s): %s\n", - type[i].bv_val, text, 0 ); - goto fail; + Debug( slapMode & SLAP_TOOL_MODE + ? LDAP_DEBUG_ANY : LDAP_DEBUG_TRACE, + "<= str2entry: str2ad(%s): %s\n", type[i].bv_val, text, 0 ); + if( slapMode & SLAP_TOOL_MODE ) { + goto fail; + } + + rc = slap_bv2undef_ad( type+i, &ad, &text, 0 ); + if( rc != LDAP_SUCCESS ) { + Debug( LDAP_DEBUG_ANY, + "<= str2entry: slap_str2undef_ad(%s): %s\n", + type[i].bv_val, text, 0 ); + goto fail; + } } - } - - /* require ';binary' when appropriate (ITS#5071) */ - if ( slap_syntax_is_binary( ad->ad_type->sat_syntax ) && !slap_ad_is_binary( ad ) ) { - Debug( LDAP_DEBUG_ANY, - "str2entry: attributeType %s #%d: " - "needs ';binary' transfer as per syntax %s\n", - ad->ad_cname.bv_val, 0, - ad->ad_type->sat_syntax->ssyn_oid ); - goto fail; - } - } - - if (( ad_prev && ad != ad_prev ) || ( i == lines )) { - int j, k; - /* FIXME: we only need this when migrating from an unsorted DB */ - if ( atail != &ahead && atail->a_desc->ad_type->sat_flags & SLAP_AT_SORTED_VAL ) { - rc = slap_sort_vals( (Modifications *)atail, &text, &j, NULL ); - if ( rc == LDAP_SUCCESS ) { - atail->a_flags |= SLAP_ATTR_SORTED_VALS; - } else if ( rc == LDAP_TYPE_OR_VALUE_EXISTS ) { + + /* require ';binary' when appropriate (ITS#5071) */ + if ( slap_syntax_is_binary( ad->ad_type->sat_syntax ) && !slap_ad_is_binary( ad ) ) { Debug( LDAP_DEBUG_ANY, - "str2entry: attributeType %s value #%d provided more than once\n", - atail->a_desc->ad_cname.bv_val, j, 0 ); + "str2entry: attributeType %s #%d: " + "needs ';binary' transfer as per syntax %s\n", + ad->ad_cname.bv_val, 0, + ad->ad_type->sat_syntax->ssyn_oid ); goto fail; } } - atail->a_next = attr_alloc( NULL ); - atail = atail->a_next; - atail->a_flags = 0; - atail->a_numvals = attr_cnt; - atail->a_desc = ad_prev; - atail->a_vals = ch_malloc( (attr_cnt + 1) * sizeof(struct berval)); - if( ad_prev->ad_type->sat_equality && - ad_prev->ad_type->sat_equality->smr_normalize ) - atail->a_nvals = ch_malloc( (attr_cnt + 1) * sizeof(struct berval)); - else - atail->a_nvals = NULL; - k = i - attr_cnt; - for ( j=0; ja_vals[j] = vals[k]; + + if (( ad_prev && ad != ad_prev ) || ( i == lines )) { + int j, k; + /* FIXME: we only need this when migrating from an unsorted DB */ + if ( atail != &ahead && atail->a_desc->ad_type->sat_flags & SLAP_AT_SORTED_VAL ) { + rc = slap_sort_vals( (Modifications *)atail, &text, &j, NULL ); + if ( rc == LDAP_SUCCESS ) { + atail->a_flags |= SLAP_ATTR_SORTED_VALS; + } else if ( rc == LDAP_TYPE_OR_VALUE_EXISTS ) { + Debug( LDAP_DEBUG_ANY, + "str2entry: attributeType %s value #%d provided more than once\n", + atail->a_desc->ad_cname.bv_val, j, 0 ); + goto fail; + } + } + atail->a_next = attr_alloc( NULL ); + atail = atail->a_next; + atail->a_flags = 0; + atail->a_numvals = attr_cnt; + atail->a_desc = ad_prev; + atail->a_vals = ch_malloc( (attr_cnt + 1) * sizeof(struct berval)); + if( ad_prev->ad_type->sat_equality && + ad_prev->ad_type->sat_equality->smr_normalize ) + atail->a_nvals = ch_malloc( (attr_cnt + 1) * sizeof(struct berval)); else - ber_dupbv( atail->a_vals+j, &vals[k] ); - vals[k].bv_val = NULL; + atail->a_nvals = NULL; + k = i - attr_cnt; + for ( j=0; ja_vals[j] = vals[k]; + else + ber_dupbv( atail->a_vals+j, &vals[k] ); + vals[k].bv_val = NULL; + if ( atail->a_nvals ) { + atail->a_nvals[j] = nvals[k]; + nvals[k].bv_val = NULL; + } + k++; + } + BER_BVZERO( &atail->a_vals[j] ); if ( atail->a_nvals ) { - atail->a_nvals[j] = nvals[k]; - nvals[k].bv_val = NULL; + BER_BVZERO( &atail->a_nvals[j] ); + } else { + atail->a_nvals = atail->a_vals; } - k++; + attr_cnt = 0; + if ( i == lines ) break; } - BER_BVZERO( &atail->a_vals[j] ); - if ( atail->a_nvals ) { - BER_BVZERO( &atail->a_nvals[j] ); - } else { - atail->a_nvals = atail->a_vals; - } - attr_cnt = 0; - if ( i == lines ) break; - } - - if ( BER_BVISNULL( &vals[i] ) ) { - Debug( LDAP_DEBUG_ANY, - "str2entry: attributeType %s #%d: " - "no value\n", - ad->ad_cname.bv_val, attr_cnt, 0 ); - goto fail; - } - - if( slapMode & SLAP_TOOL_MODE ) { - struct berval pval; - slap_syntax_validate_func *validate = - ad->ad_type->sat_syntax->ssyn_validate; - slap_syntax_transform_func *pretty = - ad->ad_type->sat_syntax->ssyn_pretty; - - if ( pretty ) { - rc = ordered_value_pretty( ad, - &vals[i], &pval, NULL ); - - } else if ( validate ) { - /* - * validate value per syntax - */ - rc = ordered_value_validate( ad, &vals[i], LDAP_MOD_ADD ); - - } else { + + if ( BER_BVISNULL( &vals[i] ) ) { Debug( LDAP_DEBUG_ANY, "str2entry: attributeType %s #%d: " - "no validator for syntax %s\n", - ad->ad_cname.bv_val, attr_cnt, - ad->ad_type->sat_syntax->ssyn_oid ); + "no value\n", + ad->ad_cname.bv_val, attr_cnt, 0 ); goto fail; } - - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "str2entry: invalid value " - "for attributeType %s #%d (syntax %s)\n", - ad->ad_cname.bv_val, attr_cnt, - ad->ad_type->sat_syntax->ssyn_oid ); - goto fail; - } - - if( pretty ) { - if ( freeval[i] ) free( vals[i].bv_val ); - vals[i] = pval; - freeval[i] = 1; + + if( slapMode & SLAP_TOOL_MODE ) { + struct berval pval; + slap_syntax_validate_func *validate = + ad->ad_type->sat_syntax->ssyn_validate; + slap_syntax_transform_func *pretty = + ad->ad_type->sat_syntax->ssyn_pretty; + + if ( pretty ) { + rc = ordered_value_pretty( ad, + &vals[i], &pval, NULL ); + + } else if ( validate ) { + /* + * validate value per syntax + */ + rc = ordered_value_validate( ad, &vals[i], LDAP_MOD_ADD ); + + } else { + Debug( LDAP_DEBUG_ANY, + "str2entry: attributeType %s #%d: " + "no validator for syntax %s\n", + ad->ad_cname.bv_val, attr_cnt, + ad->ad_type->sat_syntax->ssyn_oid ); + goto fail; + } + + if( rc != 0 ) { + Debug( LDAP_DEBUG_ANY, + "str2entry: invalid value " + "for attributeType %s #%d (syntax %s)\n", + ad->ad_cname.bv_val, attr_cnt, + ad->ad_type->sat_syntax->ssyn_oid ); + goto fail; + } + + if( pretty ) { + if ( freeval[i] ) free( vals[i].bv_val ); + vals[i] = pval; + freeval[i] = 1; + } } - } - - if ( ad->ad_type->sat_equality && - ad->ad_type->sat_equality->smr_normalize ) - { - rc = ordered_value_normalize( - SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX, - ad, - ad->ad_type->sat_equality, - &vals[i], &nvals[i], NULL ); - - if ( rc ) { - Debug( LDAP_DEBUG_ANY, - "<= str2entry NULL (smr_normalize %s %d)\n", ad->ad_cname.bv_val, rc, 0 ); - goto fail; + + if ( ad->ad_type->sat_equality && + ad->ad_type->sat_equality->smr_normalize ) + { + rc = ordered_value_normalize( + SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX, + ad, + ad->ad_type->sat_equality, + &vals[i], &nvals[i], NULL ); + + if ( rc ) { + Debug( LDAP_DEBUG_ANY, + "<= str2entry NULL (smr_normalize %s %d)\n", ad->ad_cname.bv_val, rc, 0 ); + goto fail; + } } + + attr_cnt++; } - - attr_cnt++; } free( type );