From 27aaecc744955d08d2bfe7a3ca786d742267c5bd Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 28 Jan 2013 18:45:36 -0800 Subject: [PATCH] ITS#7511 make sure cursor is marked valid after successful put --- libraries/liblmdb/mdb.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 0ef43d6..cdd8ea1 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -4639,7 +4639,7 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data, switch (op) { case MDB_GET_CURRENT: - if (!mc->mc_flags & C_INITIALIZED) { + if (!(mc->mc_flags & C_INITIALIZED)) { rc = EINVAL; } else { MDB_page *mp = mc->mc_pg[mc->mc_top]; @@ -5181,6 +5181,11 @@ put_sub: } } done: + /* If we succeeded and the key didn't exist before, make sure + * the cursor is marked valid. + */ + if (!rc && insert) + mc->mc_flags |= C_INITIALIZED; return rc; } @@ -5193,7 +5198,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags) if (F_ISSET(mc->mc_txn->mt_flags, MDB_TXN_RDONLY)) return EACCES; - if (!mc->mc_flags & C_INITIALIZED) + if (!(mc->mc_flags & C_INITIALIZED)) return EINVAL; rc = mdb_cursor_touch(mc);