Don't use non-existent node info in branch/leaf2
authorHallvard Furuseth <hallvard@openldap.org>
Sun, 16 Mar 2014 11:42:42 +0000 (12:42 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Sun, 16 Mar 2014 11:42:42 +0000 (12:42 +0100)
libraries/liblmdb/mdb.c

index 592dae4..5309b2f 100644 (file)
@@ -2105,6 +2105,7 @@ done:
                        if (m2->mc_pg[mc->mc_top] == mp) {
                                m2->mc_pg[mc->mc_top] = np;
                                if ((mc->mc_db->md_flags & MDB_DUPSORT) &&
+                                       IS_LEAF(np) &&
                                        m2->mc_ki[mc->mc_top] == mc->mc_ki[mc->mc_top])
                                {
                                        MDB_node *leaf = NODEPTR(np, mc->mc_ki[mc->mc_top]);
@@ -6305,9 +6306,11 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
                return rc;
 
        mp = mc->mc_pg[mc->mc_top];
+       if (IS_LEAF2(mp))
+               goto del_key;
        leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
 
-       if (!IS_LEAF2(mp) && F_ISSET(leaf->mn_flags, F_DUPDATA)) {
+       if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
                if (!(flags & MDB_NODUPDATA)) {
                        if (!F_ISSET(leaf->mn_flags, F_SUBDATA)) {
                                mc->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(leaf);
@@ -6351,7 +6354,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
        }
 
        /* add overflow pages to free list */
-       if (!IS_LEAF2(mp) && F_ISSET(leaf->mn_flags, F_BIGDATA)) {
+       if (F_ISSET(leaf->mn_flags, F_BIGDATA)) {
                MDB_page *omp;
                pgno_t pg;
 
@@ -6361,6 +6364,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
                        return rc;
        }
 
+del_key:
        return mdb_cursor_del0(mc);
 }