mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
fix issue with mixed attributes/objectClasses in exclusion lists (ITS#4298)
This commit is contained in:
parent
62b441bee0
commit
bccb029786
@ -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 );
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user