/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2003-2005 The OpenLDAP Foundation.
+ * Copyright 2003-2009 The OpenLDAP Foundation.
* Portions Copyright 2004 by IBM Corporation.
* All rights reserved.
*
{
ComponentSyntaxInfo *csi_attr = (ComponentSyntaxInfo*)value;
MatchingRuleAssertion * ma = (MatchingRuleAssertion*)assertedValue;
- int num_attr, rc, i;
+ int rc;
if ( !mr || !ma->ma_cf ) return LDAP_INAPPROPRIATE_MATCHING;
static int
slapd_ber2cav( struct berval* bv, ComponentAssertionValue* cav )
{
- int len;
-
cav->cav_ptr = cav->cav_buf = bv->bv_val;
cav->cav_end = bv->bv_val + bv->bv_len;
ComponentReference*
dup_comp_ref ( Operation* op, ComponentReference* cr )
{
- int rc, count = 0;
ComponentReference* dup_cr;
ComponentId* ci_curr;
ComponentId** ci_temp;
- ber_int_t type;
dup_cr = op->o_tmpalloc( sizeof( ComponentReference ), op->o_tmpmemctx );
ci_curr = ci_curr->ci_next, ci_temp = &(*ci_temp)->ci_next )
{
*ci_temp = op->o_tmpalloc( sizeof( ComponentId ), op->o_tmpmemctx );
- if ( !ci_temp ) return NULL;
+ if ( !*ci_temp ) return NULL;
**ci_temp = *ci_curr;
}
int
get_len_of_next_assert_value ( struct berval* bv, char separator )
{
- int i = 0;
+ ber_len_t i = 0;
while (1) {
if ( (bv->bv_val[ i ] == separator) || ( i >= bv->bv_len) )
break;
ComponentAssertion* in_ca,
ComponentAssertion** out_ca )
{
- ComponentAssertion* ca;
int len;
if ( !in_ca->ca_comp_ref ) return SLAPD_DISCONNECT;
return( rc );
}
+int
+get_aliased_filter_aa ( Operation* op, AttributeAssertion* a_assert, AttributeAliasing* aa, const char** text )
+{
+ struct berval assert_bv;
+
+ Debug( LDAP_DEBUG_FILTER, "get_aliased_filter\n", 0, 0, 0 );
+
+ if ( !aa->aa_cf )
+ return LDAP_PROTOCOL_ERROR;
+
+ assert_bv = a_assert->aa_value;
+ /*
+ * Duplicate aa->aa_cf to ma->ma_cf by replacing the
+ * the component assertion value in assert_bv
+ * Multiple values may be separated with '$'
+ */
+ return dup_comp_filter ( op, &assert_bv, aa->aa_cf, &a_assert->aa_cf );
+}
int
get_aliased_filter( Operation* op,
MatchingRuleAssertion* ma, AttributeAliasing* aa,
const char** text )
{
- int rc;
struct berval assert_bv;
- ComponentAssertion* ca;
Debug( LDAP_DEBUG_FILTER, "get_aliased_filter\n", 0, 0, 0 );
type = peek_componentId_type( cav );
- Debug( LDAP_DEBUG_FILTER, "get_compId [%d]\n", type, 0, 0 );
+ Debug( LDAP_DEBUG_FILTER, "get_compId [%lu]\n",
+ (unsigned long) type, 0, 0 );
len = 0;
_cid.ci_type = type;
_cid.ci_next = NULL;
if ( op ) {
*cid = op->o_tmpalloc( sizeof( ComponentId ), op->o_tmpmemctx );
} else {
- *cid = malloc( sizeof( ComponentId ) );
+ *cid = SLAP_MALLOC( sizeof( ComponentId ) );
+ }
+ if (*cid == NULL) {
+ return LDAP_NO_MEMORY;
}
**cid = _cid;
return LDAP_SUCCESS;
ca_comp_ref = op->o_tmpalloc( sizeof( ComponentReference ),
op->o_tmpmemctx );
} else {
- ca_comp_ref = malloc( sizeof( ComponentReference ) );
+ ca_comp_ref = SLAP_MALLOC( sizeof( ComponentReference ) );
}
if ( !ca_comp_ref ) return LDAP_NO_MEMORY;
cr_list = &(*cr_list)->ci_next;
} else if ( rc == LDAP_COMPREF_UNDEFINED ) {
+ if ( op ) {
+ op->o_tmpfree( ca_comp_ref , op->o_tmpmemctx );
+ } else {
+ free( ca_comp_ref );
+ }
return rc;
}
}
return rc;
}
- if ( rc == LDAP_SUCCESS ) {
- *cr = ca_comp_ref;
- **cr = *ca_comp_ref;
-
- } else if ( op ) {
- op->o_tmpfree( ca_comp_ref , op->o_tmpmemctx );
-
- } else {
- free( ca_comp_ref ) ;
- }
+ *cr = ca_comp_ref;
+ **cr = *ca_comp_ref;
(*cr)->cr_string.bv_val = start;
(*cr)->cr_string.bv_len = end - start + 1;
/*
* TAG : "item", "and", "or", "not"
*/
-static int
+static ber_tag_t
strip_cav_tag( ComponentAssertionValue* cav )
{
{
int rc;
ComponentAssertion* _ca;
- struct berval t_bv;
struct berval value;
MatchingRule* mr;
if ( op )
_ca = op->o_tmpalloc( sizeof( ComponentAssertion ), op->o_tmpmemctx );
else
- _ca = malloc( sizeof( ComponentAssertion ) );
+ _ca = SLAP_MALLOC( sizeof( ComponentAssertion ) );
if ( !_ca ) return LDAP_NO_MEMORY;
ber_tag_t tag;
int err;
ComponentFilter f;
- /* TAG : item, and, or, not in RFC 2254 */
+ /* TAG : item, and, or, not in RFC 4515 */
tag = strip_cav_tag( cav );
if ( tag == LBER_ERROR ) {
if ( op ) {
*filt = op->o_tmpalloc( sizeof(f), op->o_tmpmemctx );
} else {
- *filt = malloc( sizeof(f) );
+ *filt = SLAP_MALLOC( sizeof(f) );
+ }
+ if ( *filt == NULL ) {
+ return LDAP_NO_MEMORY;
}
**filt = f;
}
ComponentSyntaxInfo *csi_attr,
ComponentAssertion *ca )
{
- int rc, len;
+ int rc;
void *attr_nm, *assert_nm;
if ( strcmp(ca->ca_ma_rule->smr_mrule.mr_oid,
free_comp_filter( f );
}
+void
+free_ComponentData( Attribute *a ) {
+ if ( a->a_comp_data->cd_mem_op )
+ component_destructor( a->a_comp_data->cd_mem_op );
+ free ( a->a_comp_data );
+ a->a_comp_data = NULL;
+}
#endif