X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fattr.c;h=2f6203e66f2934457c08f29d0576a41a783f189c;hb=22bf5188a91d300453c4077eaa88af6b399ce7e9;hp=54cb2e4ac6269f3f5a223b617993cc7e4c79c79e;hpb=4af9eb971559e3a1f0432615e93ec870dc753ddb;p=openldap diff --git a/servers/slapd/back-bdb/attr.c b/servers/slapd/back-bdb/attr.c index 54cb2e4ac6..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-2009 The OpenLDAP Foundation. + * Copyright 2000-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -319,15 +319,20 @@ 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 ); - rc = 0; - 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),