ITS#8321 fix mdb_cursor_shadow()

Set a valid txn so that cursor fixup code works on the shadows
mdb.RE/0.9
Howard Chu 9 years ago
parent 0ec3967e1d
commit 94831f7c3f
  1. 11
      libraries/liblmdb/mdb.c

@ -2489,14 +2489,15 @@ mdb_cursor_shadow(MDB_txn *src, MDB_txn *dst)
*bk = *mc; *bk = *mc;
mc->mc_backup = bk; mc->mc_backup = bk;
mc->mc_db = &dst->mt_dbs[i]; mc->mc_db = &dst->mt_dbs[i];
/* Kill pointers into src - and dst to reduce abuse: The /* Kill pointers into src to reduce abuse: The
* user may not use mc until dst ends. Otherwise we'd... * user may not use mc until dst ends. But we need a valid
* txn pointer here for cursor fixups to keep working.
*/ */
mc->mc_txn = NULL; /* ...set this to dst */ mc->mc_txn = dst;
mc->mc_dbflag = NULL; /* ...and &dst->mt_dbflags[i] */ mc->mc_dbflag = &dst->mt_dbflags[i];
if ((mx = mc->mc_xcursor) != NULL) { if ((mx = mc->mc_xcursor) != NULL) {
*(MDB_xcursor *)(bk+1) = *mx; *(MDB_xcursor *)(bk+1) = *mx;
mx->mx_cursor.mc_txn = NULL; /* ...and dst. */ mx->mx_cursor.mc_txn = dst;
} }
mc->mc_next = dst->mt_cursors[i]; mc->mc_next = dst->mt_cursors[i];
dst->mt_cursors[i] = mc; dst->mt_cursors[i] = mc;

Loading…
Cancel
Save