From: Howard Chu Date: Tue, 18 May 2004 09:11:38 +0000 (+0000) Subject: ITS#3146 plug extended match memory leaks X-Git-Tag: OPENDLAP_REL_ENG_2_2_MP~361 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9a758383faacf5873548f05b3d7e67d7caaf2d44;p=openldap ITS#3146 plug extended match memory leaks --- diff --git a/servers/slapd/filterentry.c b/servers/slapd/filterentry.c index 681c66c5c1..8ac43338fe 100644 --- a/servers/slapd/filterentry.c +++ b/servers/slapd/filterentry.c @@ -286,6 +286,7 @@ static int test_mra_filter( /* check search access */ if ( !access_allowed( op, e, a->a_desc, &value, ACL_SEARCH, NULL ) ) { + op->o_tmpfree( value.bv_val, memctx ); continue; } @@ -297,19 +298,23 @@ static int test_mra_filter( for ( ; bv->bv_val != NULL; bv++ ) { int ret; - int rc; rc = value_match( &ret, a->a_desc, mra->ma_rule, 0, bv, &value, &text ); if( rc != LDAP_SUCCESS ) { - return rc; + break; } if ( ret == 0 ) { - return LDAP_COMPARE_TRUE; + rc = LDAP_COMPARE_TRUE; + break; } } + op->o_tmpfree( value.bv_val, memctx ); + if ( rc != LDAP_SUCCESS ) { + return rc ; + } } } @@ -325,6 +330,8 @@ static int test_mra_filter( return LDAP_INVALID_SYNTAX; } + rc = LDAP_COMPARE_FALSE; + /* for each AVA of each RDN ... */ for ( iRDN = 0; dn[ iRDN ]; iRDN++ ) { LDAPRDN rdn = dn[ iRDN ]; @@ -334,7 +341,6 @@ static int test_mra_filter( struct berval *bv = &ava->la_value, value; AttributeDescription *ad = (AttributeDescription *)ava->la_private; int ret; - int rc; const char *text; assert( ad ); @@ -366,6 +372,7 @@ static int test_mra_filter( /* check search access */ if ( !access_allowed( op, e, ad, &value, ACL_SEARCH, NULL ) ) { + op->o_tmpfree( value.bv_val, memctx ); continue; } } @@ -374,17 +381,22 @@ static int test_mra_filter( rc = value_match( &ret, ad, mra->ma_rule, 0, bv, &value, &text ); + if ( value.bv_val != mra->ma_value.bv_val ) { + op->o_tmpfree( value.bv_val, memctx ); + } + if( rc != LDAP_SUCCESS ) { - ldap_dnfree_x( dn, memctx ); - return rc; + break; } if ( ret == 0 ) { - ldap_dnfree_x( dn, memctx ); - return LDAP_COMPARE_TRUE; + rc = LDAP_COMPARE_TRUE; + break; } } } + ldap_dnfree_x( dn, memctx ); + return rc; } return LDAP_COMPARE_FALSE;