fix ITS#3498

This commit is contained in:
Pierangelo Masarati 2005-01-20 18:19:35 +00:00
parent 4ace645df8
commit 6f1bf87d24
3 changed files with 52 additions and 17 deletions

View File

@ -8,6 +8,7 @@ OpenLDAP 2.2.21 Release
Fixed back-bdb entry e_ocflags reset on objectClass modify
Fixed back-bdb retcode on referral (ITS#3475)
Fixed back-bdb detecting deadlock in indexer (ITS#3481)
Fixed back-meta DN-valued attribute delete (ITS#3498)
Fixed back-sql access checking on search (ITS#3488)
Build Environment
Misc fixes for dynamic modules (ITS#3401, #3428)

View File

@ -541,6 +541,8 @@ ldap_dnattr_rewrite(
struct berval bv;
int i, last;
assert( a_vals != NULL );
for ( last = 0; a_vals[last].bv_val != NULL; last++ );
last--;
@ -583,6 +585,8 @@ ldap_dnattr_result_rewrite(
struct berval bv;
int i, last;
assert( a_vals != NULL );
for ( last = 0; a_vals[last].bv_val; last++ );
last--;

View File

@ -90,17 +90,26 @@ meta_back_modify( Operation *op, SlapReply *rs )
dc.ctx = "modifyAttrDN";
for ( i = 0, ml = op->oq_modify.rs_modlist; ml; ml = ml->sml_next ) {
int j;
int j, is_oc = 0;
if ( ml->sml_desc->ad_type->sat_no_user_mod ) {
continue;
}
ldap_back_map( &li->targets[ candidate ]->rwmap.rwm_at,
&ml->sml_desc->ad_cname, &mapped,
BACKLDAP_MAP );
if ( mapped.bv_val == NULL || mapped.bv_val[0] == '\0' ) {
continue;
if ( ml->sml_desc == slap_schema.si_ad_objectClass
|| ml->sml_desc == slap_schema.si_ad_structuralObjectClass )
{
is_oc = 1;
mapped = ml->sml_desc->ad_cname;
} else {
ldap_back_map(&li->targets[ candidate ]->rwmap.rwm_at,
&ml->sml_desc->ad_cname,
&mapped, BACKLDAP_MAP);
if ( mapped.bv_val == NULL || mapped.bv_val[0] == '\0' )
{
continue;
}
}
modv[ i ] = &mods[ i ];
@ -112,18 +121,39 @@ meta_back_modify( Operation *op, SlapReply *rs )
* to allow their use in ACLs at the back-ldap
* level.
*/
if ( strcmp( ml->sml_desc->ad_type->sat_syntax->ssyn_oid,
SLAPD_DN_SYNTAX ) == 0 ) {
( void )ldap_dnattr_rewrite( &dc, ml->sml_values );
}
if ( ml->sml_values != NULL ) {
if ( is_oc ) {
for (j = 0; ml->sml_values[j].bv_val; j++);
mods[i].mod_bvalues = (struct berval **)ch_malloc((j+1) *
sizeof(struct berval *));
for (j = 0; ml->sml_values[j].bv_val; j++) {
ldap_back_map(&li->targets[ candidate ]->rwmap.rwm_oc,
&ml->sml_values[j],
&mapped, BACKLDAP_MAP);
if (mapped.bv_val == NULL || mapped.bv_val[0] == '\0') {
continue;
}
mods[i].mod_bvalues[j] = &mapped;
}
mods[i].mod_bvalues[j] = NULL;
if ( ml->sml_values != NULL ){
for (j = 0; ml->sml_values[ j ].bv_val; j++);
mods[ i ].mod_bvalues = (struct berval **)ch_malloc((j+1) *
sizeof(struct berval *));
for (j = 0; ml->sml_values[ j ].bv_val; j++)
mods[ i ].mod_bvalues[ j ] = &ml->sml_values[j];
mods[ i ].mod_bvalues[ j ] = NULL;
} else {
if ( strcmp( ml->sml_desc->ad_type->sat_syntax->ssyn_oid,
SLAPD_DN_SYNTAX ) == 0 )
{
( void )ldap_dnattr_rewrite( &dc, ml->sml_values );
if ( ml->sml_values == NULL ) {
continue;
}
}
for (j = 0; ml->sml_values[ j ].bv_val; j++);
mods[ i ].mod_bvalues = (struct berval **)ch_malloc((j+1) *
sizeof(struct berval *));
for (j = 0; ml->sml_values[ j ].bv_val; j++)
mods[ i ].mod_bvalues[ j ] = &ml->sml_values[j];
mods[ i ].mod_bvalues[ j ] = NULL;
}
} else {
mods[ i ].mod_bvalues = NULL;