X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-sql%2Fcompare.c;h=7d9a55bc7883869c3a5e1846c9e7b0300f2ae56e;hb=5fcc9285fb8c549a5264921a2b61cfc40803d720;hp=3a87819622cc2122ac8c2773799a50495227cb02;hpb=eb0421c471342edfe4900fbd9d5b9fd9a7c650d8;p=openldap diff --git a/servers/slapd/back-sql/compare.c b/servers/slapd/back-sql/compare.c index 3a87819622..7d9a55bc78 100644 --- a/servers/slapd/back-sql/compare.c +++ b/servers/slapd/back-sql/compare.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2005 The OpenLDAP Foundation. + * Copyright 1999-2012 The OpenLDAP Foundation. * Portions Copyright 1999 Dmitry Kovalev. * Portions Copyright 2002 Pierangelo Masarati. * All rights reserved. @@ -36,13 +36,13 @@ backsql_compare( Operation *op, SlapReply *rs ) Attribute *a = NULL; backsql_srch_info bsi = { 0 }; int rc; - AttributeName anlist[2], - *anlistp = NULL; + int manageDSAit = get_manageDSAit( op ); + AttributeName anlist[2]; Debug( LDAP_DEBUG_TRACE, "==>backsql_compare()\n", 0, 0, 0 ); rs->sr_err = backsql_get_db_conn( op, &dbh ); - if ( !dbh ) { + if ( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "backsql_compare(): " "could not get connection handle - exiting\n", 0, 0, 0 ); @@ -56,23 +56,33 @@ backsql_compare( Operation *op, SlapReply *rs ) anlist[ 0 ].an_desc = op->oq_compare.rs_ava->aa_desc; BER_BVZERO( &anlist[ 1 ].an_name ); - /* - * Try to get attr as dynamic operational - */ - if ( !is_at_operational( op->oq_compare.rs_ava->aa_desc->ad_type ) ) { - anlistp = anlist; - } - /* * Get the entry */ bsi.bsi_e = &e; - rc = backsql_init_search( &bsi, &op->o_req_ndn, - LDAP_SCOPE_BASE, - SLAP_NO_LIMIT, SLAP_NO_LIMIT, - (time_t)(-1), NULL, dbh, op, rs, anlistp, + rc = backsql_init_search( &bsi, &op->o_req_ndn, LDAP_SCOPE_BASE, + (time_t)(-1), NULL, dbh, op, rs, anlist, ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) ); - if ( rc != LDAP_SUCCESS ) { + switch ( rc ) { + case LDAP_SUCCESS: + break; + + case LDAP_REFERRAL: + if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) && + dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname ) ) + { + rs->sr_err = LDAP_SUCCESS; + rs->sr_text = NULL; + rs->sr_matched = NULL; + if ( rs->sr_ref ) { + ber_bvarray_free( rs->sr_ref ); + rs->sr_ref = NULL; + } + break; + } + /* fallthru */ + + default: Debug( LDAP_DEBUG_TRACE, "backsql_compare(): " "could not retrieve compareDN ID - no such entry\n", 0, 0, 0 ); @@ -88,11 +98,11 @@ backsql_compare( Operation *op, SlapReply *rs ) } if ( is_at_operational( op->oq_compare.rs_ava->aa_desc->ad_type ) ) { - SlapReply nrs = { 0 }; + SlapReply nrs = { REP_SEARCH }; + Attribute **ap; - e.e_attrs = NULL; - ber_dupbv( &e.e_name, &bsi.bsi_base_id.eid_dn ); - ber_dupbv( &e.e_nname, &bsi.bsi_base_id.eid_ndn ); + for ( ap = &e.e_attrs; *ap; ap = &(*ap)->a_next ) + ; nrs.sr_attrs = anlist; nrs.sr_entry = &e; @@ -104,17 +114,7 @@ backsql_compare( Operation *op, SlapReply *rs ) goto return_results; } - e.e_attrs = nrs.sr_operational_attrs; - - } else { - rc = backsql_id2entry( &bsi, &bsi.bsi_base_id ); - if ( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_TRACE, "backsql_compare(): " - "error %d in backsql_id2entry() " - "- compare failed\n", rc, 0, 0 ); - rs->sr_err = rc; - goto return_results; - } + *ap = nrs.sr_operational_attrs; } if ( ! access_allowed( op, &e, op->oq_compare.rs_ava->aa_desc, @@ -131,11 +131,10 @@ backsql_compare( Operation *op, SlapReply *rs ) a = attrs_find( a->a_next, op->oq_compare.rs_ava->aa_desc ) ) { rs->sr_err = LDAP_COMPARE_FALSE; - if ( value_find_ex( op->oq_compare.rs_ava->aa_desc, + if ( attr_valfind( a, SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH, - a->a_nvals, - &op->oq_compare.rs_ava->aa_value, + &op->oq_compare.rs_ava->aa_value, NULL, op->o_tmpmemctx ) == 0 ) { rs->sr_err = LDAP_COMPARE_TRUE; @@ -150,7 +149,6 @@ return_results:; break; default: -#ifdef SLAP_ACL_HONOR_DISCLOSE if ( !BER_BVISNULL( &e.e_nname ) && ! access_allowed( op, &e, slap_schema.si_ad_entry, NULL, @@ -159,7 +157,6 @@ return_results:; rs->sr_err = LDAP_NO_SUCH_OBJECT; rs->sr_text = NULL; } -#endif /* SLAP_ACL_HONOR_DISCLOSE */ break; } @@ -175,11 +172,11 @@ return_results:; } if ( !BER_BVISNULL( &bsi.bsi_base_id.eid_ndn ) ) { - (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 ); + (void)backsql_free_entryID( &bsi.bsi_base_id, 0, op->o_tmpmemctx ); } if ( !BER_BVISNULL( &e.e_nname ) ) { - entry_clean( &e ); + backsql_entry_clean( op, &e ); } if ( bsi.bsi_attrs != NULL ) {