[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#9037) observing crash in mdb_cursor_put()



myk@mykzilla.org wrote:
> hyc@symas.com wrote on 2019-06-18 01:30:
>> There is no issue with mdb_cursor_put then. The question is why didn't mdb_page_search find the DBI's root node?
> Would it be useful for mdb_cursor_init to return the result code of 
> mdb_page_search, and for mdb_put to then return that code if it isn't 
> MDB_SUCCESS?

Maybe. For testing purposes you could try something like this
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index 692feaa38b..e41f3bc36a 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -7620,7 +7620,8 @@ mdb_cursor_init(MDB_cursor *mc, MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx)
                mc->mc_xcursor = NULL;
        }
        if (*mc->mc_dbflag & DB_STALE) {
-               mdb_page_search(mc, NULL, MDB_PS_ROOTONLY);
+               int rc = mdb_page_search(mc, NULL, MDB_PS_ROOTONLY);
+               mdb_cassert(mc, !rc);
        }
 }


I suspect the problem will simply be that you've used an invalid DBI.
> 
> That wouldn't resolve the problem, but it might avoid the crash and 
> provide some insight into the failure (if mdb_page_search is actually 
> returning a failure code when it doesn't find the DBI's root node).
> 
> -myk
> 
> 
> 
> 
> 


-- 
  -- Howard Chu
  CTO, Symas Corp.           http://www.symas.com
  Director, Highland Sun     http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP  http://www.openldap.org/project/