X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fattr.c;h=2f6203e66f2934457c08f29d0576a41a783f189c;hb=22bf5188a91d300453c4077eaa88af6b399ce7e9;hp=bad6c11d2b2b7d5518e2f396e378fc26fab8a359;hpb=888731e6c3a0976d6c0838cd4a60964df0368844;p=openldap diff --git a/servers/slapd/back-bdb/attr.c b/servers/slapd/back-bdb/attr.c index bad6c11d2b..2f6203e66f 100644 --- a/servers/slapd/back-bdb/attr.c +++ b/servers/slapd/back-bdb/attr.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2005 The OpenLDAP Foundation. + * Copyright 2000-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,17 +23,21 @@ #include "slap.h" #include "back-bdb.h" +#include "config.h" #include "lutil.h" -unsigned -bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad ) +/* Find the ad, return -1 if not found, + * set point for insertion if ins is non-NULL + */ +int +bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, int *ins ) { unsigned base = 0, cursor = 0; unsigned n = bdb->bi_nattrs; - int val; + int val = 0; while ( 0 < n ) { - int pivot = n >> 1; + unsigned pivot = n >> 1; cursor = base + pivot; val = SLAP_PTRCMP( ad, bdb->bi_attrs[cursor]->ai_desc ); @@ -46,18 +50,22 @@ bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad ) return cursor; } } - if ( val > 0 ) - ++cursor; - return cursor; + if ( ins ) { + if ( val > 0 ) + ++cursor; + *ins = cursor; + } + return -1; } static int ainfo_insert( struct bdb_info *bdb, AttrInfo *a ) { - unsigned x = bdb_attr_slot( bdb, a->ai_desc ); + int x; + int i = bdb_attr_slot( bdb, a->ai_desc, &x ); /* Is it a dup? */ - if ( x < bdb->bi_nattrs && bdb->bi_attrs[x]->ai_desc == a->ai_desc ) + if ( i >= 0 ) return -1; bdb->bi_attrs = ch_realloc( bdb->bi_attrs, ( bdb->bi_nattrs+1 ) * @@ -75,9 +83,8 @@ bdb_attr_mask( struct bdb_info *bdb, AttributeDescription *desc ) { - unsigned i = bdb_attr_slot( bdb, desc ); - return ( i < bdb->bi_nattrs && bdb->bi_attrs[i]->ai_desc == desc ) ? - bdb->bi_attrs[i] : NULL; + int i = bdb_attr_slot( bdb, desc, NULL ); + return i < 0 ? NULL : bdb->bi_attrs[i]; } int @@ -86,9 +93,10 @@ bdb_attr_index_config( const char *fname, int lineno, int argc, - char **argv ) + char **argv, + struct config_reply_s *c_reply) { - int rc; + int rc = 0; int i; slap_mask_t mask; char **attrs; @@ -110,7 +118,8 @@ bdb_attr_index_config( fprintf( stderr, "%s: line %d: " "no indexes specified: %s\n", fname, lineno, argv[1] ); - return LDAP_PARAM_ERROR; + rc = LDAP_PARAM_ERROR; + goto done; } } @@ -125,10 +134,16 @@ bdb_attr_index_config( rc = slap_str2index( indexes[i], &index ); if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index type \"%s\" undefined\n", - fname, lineno, indexes[i] ); - return LDAP_PARAM_ERROR; + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index type \"%s\" undefined", indexes[i] ); + + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_PARAM_ERROR; + goto done; } mask |= index; @@ -136,10 +151,15 @@ bdb_attr_index_config( } if( !mask ) { - fprintf( stderr, "%s: line %d: " - "no indexes selected\n", - fname, lineno ); - return LDAP_PARAM_ERROR; + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "no indexes selected" ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_PARAM_ERROR; + goto done; } for ( i = 0; attrs[i] != NULL; i++ ) { @@ -160,10 +180,15 @@ bdb_attr_index_config( if ( is_component_reference( attrs[i] ) ) { rc = extract_component_reference( attrs[i], &cr ); if ( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index component reference\"%s\" undefined\n", - fname, lineno, attrs[i] ); - return rc; + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index component reference\"%s\" undefined", + attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + goto done; } cr->cr_indexmask = mask; /* @@ -173,27 +198,32 @@ bdb_attr_index_config( } else { cr = NULL; } -#endif - a = (AttrInfo *) ch_malloc( sizeof(AttrInfo) ); - -#ifdef LDAP_COMP_MATCH - a->ai_cr = NULL; #endif ad = NULL; rc = slap_str2ad( attrs[i], &ad, &text ); if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index attribute \"%s\" undefined\n", - fname, lineno, attrs[i] ); - return rc; + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index attribute \"%s\" undefined", + attrs[i] ); + + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + goto done; } - if( slap_ad_is_binary( ad ) ) { - fprintf( stderr, "%s: line %d: " - "index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); - return LDAP_UNWILLING_TO_PERFORM; + if( ad == slap_schema.si_ad_entryDN || slap_ad_is_binary( ad ) ) { + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_UNWILLING_TO_PERFORM; + goto done; } if( IS_SLAP_INDEX( mask, SLAP_INDEX_APPROX ) && !( @@ -201,10 +231,14 @@ bdb_attr_index_config( && ad->ad_type->sat_approx->smr_indexer && ad->ad_type->sat_approx->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "approx index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); - return LDAP_INAPPROPRIATE_MATCHING; + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "approx index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_INAPPROPRIATE_MATCHING; + goto done; } if( IS_SLAP_INDEX( mask, SLAP_INDEX_EQUALITY ) && !( @@ -212,10 +246,14 @@ bdb_attr_index_config( && ad->ad_type->sat_equality->smr_indexer && ad->ad_type->sat_equality->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "equality index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); - return LDAP_INAPPROPRIATE_MATCHING; + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "equality index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_INAPPROPRIATE_MATCHING; + goto done; } if( IS_SLAP_INDEX( mask, SLAP_INDEX_SUBSTR ) && !( @@ -223,15 +261,24 @@ bdb_attr_index_config( && ad->ad_type->sat_substr->smr_indexer && ad->ad_type->sat_substr->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "substr index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); - return LDAP_INAPPROPRIATE_MATCHING; + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "substr index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } + rc = LDAP_INAPPROPRIATE_MATCHING; + goto done; } Debug( LDAP_DEBUG_CONFIG, "index %s 0x%04lx\n", ad->ad_cname.bv_val, mask, 0 ); + a = (AttrInfo *) ch_malloc( sizeof(AttrInfo) ); + +#ifdef LDAP_COMP_MATCH + a->ai_cr = NULL; +#endif a->ai_desc = ad; if ( bdb->bi_flags & BDB_IS_OPEN ) { @@ -254,14 +301,16 @@ bdb_attr_index_config( rc = insert_component_reference( cr, &a_cr->ai_cr ); if ( rc != LDAP_SUCCESS) { fprintf( stderr, " error during inserting component reference in %s ", attrs[i]); - return LDAP_PARAM_ERROR; + rc = LDAP_PARAM_ERROR; + goto done; } continue; } else { rc = insert_component_reference( cr, &a->ai_cr ); if ( rc != LDAP_SUCCESS) { fprintf( stderr, " error during inserting component reference in %s ", attrs[i]); - return LDAP_PARAM_ERROR; + rc = LDAP_PARAM_ERROR; + goto done; } } } @@ -270,27 +319,39 @@ bdb_attr_index_config( if( rc ) { if ( bdb->bi_flags & BDB_IS_OPEN ) { AttrInfo *b = bdb_attr_mask( bdb, ad ); - /* If we were editing this attr, reset it */ - b->ai_indexmask &= ~BDB_INDEX_DELETING; - /* If this is leftover from a previous add, commit it */ - if ( b->ai_newmask ) - b->ai_indexmask = b->ai_newmask; - b->ai_newmask = a->ai_newmask; - ch_free( a ); - continue; + /* If there is already an index defined for this attribute + * it must be replaced. Otherwise we end up with multiple + * olcIndex values for the same attribute */ + if ( b->ai_indexmask & BDB_INDEX_DELETING ) { + /* If we were editing this attr, reset it */ + b->ai_indexmask &= ~BDB_INDEX_DELETING; + /* If this is leftover from a previous add, commit it */ + if ( b->ai_newmask ) + b->ai_indexmask = b->ai_newmask; + b->ai_newmask = a->ai_newmask; + ch_free( a ); + rc = 0; + continue; + } + } + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "duplicate index definition for attr \"%s\"", + attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); } - fprintf( stderr, "%s: line %d: duplicate index definition " - "for attr \"%s\"" SLAPD_CONF_UNKNOWN_IGNORED ".\n", - fname, lineno, attrs[i] ); - return LDAP_PARAM_ERROR; + rc = LDAP_PARAM_ERROR; + goto done; } } +done: ldap_charray_free( attrs ); if ( indexes != NULL ) ldap_charray_free( indexes ); - return LDAP_SUCCESS; + return rc; } static int @@ -352,10 +413,10 @@ bdb_attr_index_destroy( struct bdb_info *bdb ) void bdb_attr_index_free( struct bdb_info *bdb, AttributeDescription *ad ) { - unsigned i; + int i; - i = bdb_attr_slot( bdb, ad ); - if ( i < bdb->bi_nattrs && bdb->bi_attrs[i]->ai_desc == ad ) { + i = bdb_attr_slot( bdb, ad, NULL ); + if ( i >= 0 ) { bdb_attr_info_free( bdb->bi_attrs[i] ); bdb->bi_nattrs--; for (; ibi_nattrs; i++)