diff --git a/servers/slapd/overlays/translucent.c b/servers/slapd/overlays/translucent.c index 4fae3d92bf1b1cbfa754decce049609d492dc19a..7e9b3ced7b266263c637fb52372ef90cdc73f7fa 100644 --- a/servers/slapd/overlays/translucent.c +++ b/servers/slapd/overlays/translucent.c @@ -232,7 +232,7 @@ static int translucent_modify(Operation *op, SlapReply *rs) { void *private = op->o_bd->be_private; Entry ne, *e = NULL, *re = NULL; Attribute *a, *ax; - Modifications *m, *mm; + Modifications *m, **mm; int del, rc, erc = 0; slap_callback cb = { 0 }; @@ -275,10 +275,14 @@ static int translucent_modify(Operation *op, SlapReply *rs) { if(e && rc == LDAP_SUCCESS) { Debug(LDAP_DEBUG_TRACE, "=> translucent_modify: found local entry\n", 0, 0, 0); - for(m = op->orm_modlist; m; m = m->sml_next) { + for(mm = &op->orm_modlist; *mm; ) { + m = *mm; for(a = e->e_attrs; a; a = a->a_next) if(a->a_desc == m->sml_desc) break; - if(a) continue; /* found local attr */ + if(a) { + mm = &m->sml_next; + continue; /* found local attr */ + } if(m->sml_op == LDAP_MOD_DELETE) { for(a = re->e_attrs; a; a = a->a_next) if(a->a_desc == m->sml_desc) break; @@ -294,14 +298,13 @@ static int translucent_modify(Operation *op, SlapReply *rs) { Debug(LDAP_DEBUG_TRACE, "=> translucent_modify: silently dropping delete: %s\n", m->sml_desc->ad_cname.bv_val, 0, 0); - for(mm = op->orm_modlist; mm->sml_next != m; mm = mm->sml_next); - mm->sml_next = m->sml_next; + *mm = m->sml_next; m->sml_next = NULL; slap_mods_free(m, 1); - m = mm; continue; } m->sml_op = LDAP_MOD_ADD; + mm = &m->sml_next; } erc = SLAP_CB_CONTINUE; release: diff --git a/tests/data/test-translucent-data.ldif b/tests/data/test-translucent-data.ldif index ee32cbbc74bf9f0320d13ca81da1a2f069eb05b8..2def65c835bfe6538894175017188cc45bc5b08f 100644 --- a/tests/data/test-translucent-data.ldif +++ b/tests/data/test-translucent-data.ldif @@ -5,6 +5,7 @@ uid: danger sn: warning cn: danger businessCategory: backend-opaque +initials: dw carLicense: BACK departmentNumber: 7341 displayName: Warning diff --git a/tests/data/test-translucent-merged.ldif b/tests/data/test-translucent-merged.ldif index 5bb54ec31ab4671fd637b1425e20dea4a95df339..583734a3a3e2213cfb0ec7c07d34ac001ab8c05c 100644 --- a/tests/data/test-translucent-merged.ldif +++ b/tests/data/test-translucent-merged.ldif @@ -4,6 +4,7 @@ uid: danger sn: danger cn: henry businessCategory: frontend-override +initials: dw carLicense: LIVID departmentNumber: 9999999 displayName: Warning diff --git a/tests/scripts/test034-translucent b/tests/scripts/test034-translucent index e0a03f9e2087c7a792de65fb45ef692b9c41dda4..9a2415f0044b4c0c64d2e29bb7fab97a72b72f0c 100755 --- a/tests/scripts/test034-translucent +++ b/tests/scripts/test034-translucent @@ -577,6 +577,24 @@ if test $RC != 16 ; then exit 1 fi +echo "Testing delete: valid local record, remote attribute..." + +$LDAPMODIFY -v -D "$TRANSLUCENTROOT" -H $URI2 -w $PASSWD > \ + $TESTOUT 2>&1 << EOF_MOD8 +version: 1 +dn: uid=danger,ou=users,o=translucent +changetype: modify +delete: initials +EOF_MOD8 + +RC=$? +if test $RC != 0 ; then + echo "ldapmodify failed ($RC)" + grep "$FAILURE" $TESTOUT + test $KILLSERVERS != no && kill -HUP $KILLPIDS + exit 1 +fi + echo "Testing modify: valid remote record, combination add-modify-delete..." $LDAPMODIFY -v -D "$TRANSLUCENTROOT" -H $URI2 -w $PASSWD > \