X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Fcompare.c;h=8fa2fa4154232e776d7b7b74f9c6cbda097adb8f;hb=9fd0ad6f68f361d780bd64e6127309f6b05bd489;hp=57af1d3505ec0d60de938b399dbd4e40f8cf10ff;hpb=fbba83b20f3a645b2dc19b8ec4a0026f71f5b15c;p=openldap diff --git a/servers/slapd/back-monitor/compare.c b/servers/slapd/back-monitor/compare.c index 57af1d3505..8fa2fa4154 100644 --- a/servers/slapd/back-monitor/compare.c +++ b/servers/slapd/back-monitor/compare.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2001-2003 The OpenLDAP Foundation. + * Copyright 2001-2010 The OpenLDAP Foundation. * Portions Copyright 2001-2003 Pierangelo Masarati. * All rights reserved. * @@ -27,19 +27,26 @@ #include "back-monitor.h" int -monitor_back_compare( struct slap_op *op, struct slap_rep *rs) +monitor_back_compare( Operation *op, SlapReply *rs ) { - struct monitorinfo *mi = - (struct monitorinfo *) op->o_bd->be_private; + monitor_info_t *mi = ( monitor_info_t * ) op->o_bd->be_private; Entry *e, *matched = NULL; Attribute *a; + int rc; /* get entry with reader lock */ - monitor_cache_dn2entry( op, &op->o_req_ndn, &e, &matched ); + monitor_cache_dn2entry( op, rs, &op->o_req_ndn, &e, &matched ); if ( e == NULL ) { rs->sr_err = LDAP_NO_SUCH_OBJECT; if ( matched ) { - rs->sr_matched = matched->e_dn; + if ( !access_allowed_mask( op, matched, + slap_schema.si_ad_entry, + NULL, ACL_DISCLOSE, NULL, NULL ) ) + { + /* do nothing */ ; + } else { + rs->sr_matched = matched->e_dn; + } } send_ldap_result( op, rs ); if ( matched ) { @@ -47,43 +54,28 @@ monitor_back_compare( struct slap_op *op, struct slap_rep *rs) rs->sr_matched = NULL; } - return( 0 ); + return rs->sr_err; } - rs->sr_err = access_allowed( op, e, op->oq_compare.rs_ava->aa_desc, - &op->oq_compare.rs_ava->aa_value, ACL_COMPARE, NULL ); - if ( !rs->sr_err ) { - rs->sr_err = LDAP_INSUFFICIENT_ACCESS; - goto return_results; - } - - rs->sr_err = LDAP_NO_SUCH_ATTRIBUTE; + rs->sr_err = slap_compare_entry( op, e, op->orc_ava ); - for ( a = attrs_find( e->e_attrs, op->oq_compare.rs_ava->aa_desc ); - a != NULL; - a = attrs_find( a->a_next, op->oq_compare.rs_ava->aa_desc )) { - rs->sr_err = LDAP_COMPARE_FALSE; +return_results:; + rc = rs->sr_err; + switch ( rc ) { + case LDAP_COMPARE_FALSE: + case LDAP_COMPARE_TRUE: + rc = LDAP_SUCCESS; + break; - if ( value_find_ex( op->oq_compare.rs_ava->aa_desc, - SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH | - SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH, - a->a_nvals, &op->oq_compare.rs_ava->aa_value, - op->o_tmpmemctx ) == 0 ) - { - rs->sr_err = LDAP_COMPARE_TRUE; - break; - } + default: + break; } - -return_results:; + send_ldap_result( op, rs ); - if ( rs->sr_err == LDAP_COMPARE_FALSE - || rs->sr_err == LDAP_COMPARE_TRUE ) { - rs->sr_err = LDAP_SUCCESS; - } + rs->sr_err = rc; monitor_cache_release( mi, e ); - return( rs->sr_err ); + return rs->sr_err; }