From: Kurt Zeilenga Date: Tue, 6 Apr 2004 21:06:35 +0000 (+0000) Subject: ITS#3059: modrdn should delete than add. X-Git-Tag: OPENLDAP_REL_ENG_2_2_BP~117 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=0c2c38c02fd73f497472e1e4da887814163a4126;p=openldap ITS#3059: modrdn should delete than add. --- diff --git a/servers/slapd/back-ldbm/modrdn.c b/servers/slapd/back-ldbm/modrdn.c index 11085b8535..9a404409ca 100644 --- a/servers/slapd/back-ldbm/modrdn.c +++ b/servers/slapd/back-ldbm/modrdn.c @@ -614,28 +614,46 @@ ldbm_back_modrdn( goto return_results; } - /* add new one */ - if ( dn2id_add( op->o_bd, &e->e_nname, e->e_id ) != 0 ) { - send_ldap_error( op, rs, LDAP_OTHER, - "DN index add failed" ); - goto return_results; - } + /* + * NOTE: the backend MUST delete then add the entry, + * otherwise indexing may get hosed + * FIXME: if a new ID was used, the add could be done first. + * that would be safer. + */ + /* delete old one */ if ( dn2id_delete( op->o_bd, &old_ndn, e->e_id ) != 0 ) { - /* undo add of new one */ - dn2id_delete( op->o_bd, &e->e_nname, e->e_id ); send_ldap_error( op, rs, LDAP_OTHER, "DN index delete fail" ); goto return_results; } + /* add new one */ + if ( dn2id_add( op->o_bd, &e->e_nname, e->e_id ) != 0 ) { + /* try to repair old entry - probably hopeless */ + if( dn2id_add( op->o_bd, &old_ndn, e->e_id) != 0 ) { + send_ldap_error( op, rs, LDAP_OTHER, + "DN index add and repair failed" ); + } else { + send_ldap_error( op, rs, LDAP_OTHER, + "DN index add failed" ); + } + goto return_results; + } + /* id2entry index */ if ( id2entry_add( op->o_bd, e ) != 0 ) { /* Try to undo */ - dn2id_delete( op->o_bd, &e->e_nname, e->e_id ); - dn2id_add( op->o_bd, &old_ndn, e->e_id ); - send_ldap_error( op, rs, LDAP_OTHER, - "entry update failed" ); + int rc; + rc = dn2id_delete( op->o_bd, &e->e_nname, e->e_id ); + rc |= dn2id_add( op->o_bd, &old_ndn, e->e_id ); + if( rc ) { + send_ldap_error( op, rs, LDAP_OTHER, + "entry update and repair failed" ); + } else { + send_ldap_error( op, rs, LDAP_OTHER, + "entry update failed" ); + } goto return_results; }