[Date Prev][Date Next] [Chronological] [Thread] [Top]

Possible bug in meta backend??



Hi list,
First of all, I want to say this is a code question, so perhaps I should send it to the bug or development mailing lists instead of sending it to this one. If this is the case, please, let me know, and I apologize for the mess.
Im using OpenLDAP 2.1.25, and I've detected a strange behaviour in the meta backend: in some LDAP "search" operations it takes as candidates to send the operation some targets whose naming context has nothing to do with the base of the "search", then it sends to them the "search" operation, but they shouldn't have to receive it. The cause for this is in the "bind" operation previous to the "search" one: this operation marks its candidate targets, and this targets still remain marked for the next operation: the "search" one.
I think the reason for all this is in the function meta_back_getconn() from the conn.c source file in the meta backend: This function, depending on its argument op_type marks the different candidate targets for each LDAP operation. In the "search" operation case, op_type=META_OP_ALLOW_MULTIPLE, and in this case meta_back_getconn() does the following "for" loop:


       for ( i = 0; i < li->ntargets; i++ ) {
           if ( i == cached
       || meta_back_is_candidate( &li->targets[ i ]->suffix, ndn ) ) {

/*
* The target is activated; if needed, it is
* also init'd
*/
int lerr = init_one_conn( conn, op,
li->targets[ i ],
&lc->conns[ i ] );
if ( lerr != LDAP_SUCCESS ) {
/*
* FIXME: in case one target cannot
* be init'd, should the other ones
* be tried?
*/
( void )meta_clear_one_candidate( &lc->conns[ i ], 1 );
err = lerr;
continue;
}
}
}
This loop looks for every target if it is a candidate, and if it is, it is marked as candidate, but if the target is not a candidate, then nothing is done... but the list of targets is the same as in the previous LDAP operation, so the candidates marked for that one remain marked, even if they are not good candidates for the "search" operation... Then I think the "if " in the "for" loop must be followed by an "else" where the candidate is unmarked if it was marked before (I supposse the meta_clear_one candidate() function can be used for this).
So, I would know what do you think about this, am I right?, or I'm missing something somewhere?
Any kind of help would be appreciated. Thank you very much.
Kind regards,


   Aníbal.