fix issue with mixed attributes/objectClasses in exclusion lists (ITS#4298)

This commit is contained in:
Pierangelo Masarati 2006-01-03 23:33:50 +00:00
parent 62b441bee0
commit bccb029786

View File

@ -328,11 +328,22 @@ replog1(
if ( ri && ri->ri_attrs ) {
int is_in = ad_inlist( ml->sml_desc, ri->ri_attrs );
/* skip if:
* 1) the attribute is not in the list,
* and it's not an exclusion list
* 2) the attribute is in the list
* and it's an exclusion list,
* and either the objectClass attribute
* has already been dealt with or
* this is not the objectClass attr
*/
if ( ( !is_in && !ri->ri_exclude )
|| ( is_in && ri->ri_exclude ) )
|| ( ( is_in && ri->ri_exclude )
&& ( !ocs || a->a_desc != slap_schema.si_ad_objectClass ) ) )
{
continue;
}
/* If this is objectClass, see if the value is included
* in any subset, otherwise drop it.
*/
@ -347,11 +358,24 @@ replog1(
int match = 0;
for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) {
if ( an->an_oc ) {
struct berval bv = an->an_name;
ocs = 1;
match |= an->an_oc_exclude;
if ( ml->sml_values[i].bv_len == an->an_name.bv_len
switch ( bv.bv_val[ 0 ] ) {
case '@':
case '+':
case '!':
bv.bv_val++;
bv.bv_len--;
break;
}
if ( ml->sml_values[i].bv_len == bv.bv_len
&& !strcasecmp(ml->sml_values[i].bv_val,
an->an_name.bv_val ) ) {
bv.bv_val ) )
{
match = !an->an_oc_exclude;
break;
}
@ -374,7 +398,7 @@ replog1(
fprintf( fp, "%s: %s\n", did, type );
first = 0;
}
vals[0] = an->an_name;
vals[0] = a->a_nvals[i];
print_vals( fp, &ml->sml_desc->ad_cname, vals );
ocs = 2;
}
@ -406,7 +430,20 @@ replog1(
for ( a = op->ora_e->e_attrs ; a != NULL; a=a->a_next ) {
if ( ri && ri->ri_attrs ) {
int is_in = ad_inlist( a->a_desc, ri->ri_attrs );
if ( ( !is_in && !ri->ri_exclude ) || ( is_in && ri->ri_exclude ) ) {
/* skip if:
* 1) the attribute is not in the list,
* and it's not an exclusion list
* 2) the attribute is in the list
* and it's an exclusion list,
* and either the objectClass attribute
* has already been dealt with or
* this is not the objectClass attr
*/
if ( ( !is_in && !ri->ri_exclude )
|| ( ( is_in && ri->ri_exclude )
&& ( !ocs || a->a_desc != slap_schema.si_ad_objectClass ) ) )
{
continue;
}
@ -423,11 +460,24 @@ replog1(
int match = 0;
for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) {
if ( an->an_oc ) {
struct berval bv = an->an_name;
ocs = 1;
match |= an->an_oc_exclude;
if ( a->a_vals[i].bv_len == an->an_name.bv_len
switch ( bv.bv_val[ 0 ] ) {
case '@':
case '+':
case '!':
bv.bv_val++;
bv.bv_len--;
break;
}
if ( a->a_vals[i].bv_len == bv.bv_len
&& !strcasecmp(a->a_vals[i].bv_val,
an->an_name.bv_val ) ) {
bv.bv_val ) )
{
match = !an->an_oc_exclude;
break;
}
@ -442,7 +492,7 @@ replog1(
fprintf( fp, "changetype: add\n" );
dohdr = 0;
}
vals[0] = an->an_name;
vals[0] = a->a_nvals[i];
print_vals( fp, &a->a_desc->ad_cname, vals );
}
}