struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
int rc;
Entry *e = NULL;
+ EntryInfo *ei;
struct berval hash = { 0, NULL };
- DB_TXN *ltid = NULL;
+ DB_TXN *ltid = NULL, *lt2;
struct bdb_op_info opinfo;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
rs->sr_rspdata = slap_passwd_return( &new );
}
- slap_passwd_hash( &new, &hash );
+ slap_passwd_hash( &new, &hash, &rs->sr_text );
if( hash.bv_len == 0 ) {
- rs->sr_text = "password hash failed";
+ if( !rs->sr_text ) rs->sr_text = "password hash failed";
rc = LDAP_OTHER;
goto done;
}
goto done;
}
- rc = dnNormalize2( NULL, &dn, &ndn );
+ rc = dnNormalize( 0, NULL, NULL, &dn, &ndn, op->o_tmpmemctx );
if( rc != LDAP_SUCCESS ) {
rs->sr_text = "Invalid DN";
goto done;
if( 0 ) {
retry: /* transaction retry */
if ( e != NULL ) {
- bdb_cache_delete_entry(&bdb->bi_cache, e);
bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e);
}
#ifdef NEW_LOGGING
op->o_private = &opinfo;
/* get entry */
- rc = bdb_dn2entry_w( op->o_bd, ltid, &ndn, &e, NULL, 0 , locker, &lock);
+ rc = bdb_dn2entry( op->o_bd, ltid, &ndn, &ei, 0 , locker, &lock, op->o_tmpmemctx );
switch(rc) {
case DB_LOCK_DEADLOCK:
goto done;
}
+ if ( ei ) e = ei->bei_e;
+
if( e == NULL ) {
rs->sr_text = "could not locate authorization entry";
rc = LDAP_NO_SUCH_OBJECT;
#ifdef BDB_SUBENTRIES
if( is_entry_subentry( e ) ) {
- /* entry is an alias, don't allow operation */
+ /* entry is a subentry, don't allow operation */
rs->sr_text = "authorization entry is subentry";
rc = LDAP_OTHER;
goto done;
goto done;
}
+ /* nested transaction */
+ rc = TXN_BEGIN( bdb->bi_dbenv, ltid, <2,
+ bdb->bi_db_opflags );
+ rs->sr_text = NULL;
+ if( rc != 0 ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG ( OPERATION, ERR,
+ "bdb_exop_passwd: txn_begin(2) failed: %s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "bdb_exop_passwd: txn_begin(2) failed: %s (%d)\n",
+ db_strerror(rs->sr_err), rs->sr_err, 0 );
+#endif
+ rc = LDAP_OTHER;
+ rs->sr_text = "internal error";
+ goto done;
+ }
{
Modifications ml;
struct berval vals[2];
+ Entry dummy, *save;
+
+ save = e;
+ dummy = *e;
+ e = &dummy;
vals[0] = hash;
vals[1].bv_val = NULL;
ml.sml_op = LDAP_MOD_REPLACE;
ml.sml_next = NULL;
- rc = bdb_modify_internal( op, ltid,
+ rc = bdb_modify_internal( op, lt2,
&ml, e, &rs->sr_text, textbuf, textlen );
if ( (rc == LDAP_INSUFFICIENT_ACCESS) && opinfo.boi_err ) {
}
/* change the entry itself */
- rc = bdb_id2entry_update( op->o_bd, ltid, e );
+ rc = bdb_id2entry_update( op->o_bd, lt2, e );
if( rc != 0 ) {
switch(rc) {
case DB_LOCK_DEADLOCK:
rs->sr_text = "entry update failed";
rc = LDAP_OTHER;
}
+ if ( TXN_COMMIT( lt2, 0 ) != 0 ) {
+ rc = LDAP_OTHER;
+ rs->sr_text = "txn_commit(2) failed";
+ }
if( rc == 0 ) {
if( op->o_noop ) {
rc = TXN_ABORT( ltid );
} else {
+ bdb_cache_modify( save, e->e_attrs,
+ bdb->bi_dbenv, locker, &lock );
rc = TXN_COMMIT( ltid, 0 );
}
ltid = NULL;
}
if( ndn.bv_val != NULL ) {
- free( ndn.bv_val );
+ op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );
}
if( ltid != NULL ) {