Don't use non-existent node info in branch/leaf2

incre
Hallvard Furuseth 11 years ago
parent 86f8b203f5
commit 937b5eff07
  1. 8
      libraries/liblmdb/mdb.c

@ -2105,6 +2105,7 @@ done:
if (m2->mc_pg[mc->mc_top] == mp) { if (m2->mc_pg[mc->mc_top] == mp) {
m2->mc_pg[mc->mc_top] = np; m2->mc_pg[mc->mc_top] = np;
if ((mc->mc_db->md_flags & MDB_DUPSORT) && if ((mc->mc_db->md_flags & MDB_DUPSORT) &&
IS_LEAF(np) &&
m2->mc_ki[mc->mc_top] == mc->mc_ki[mc->mc_top]) m2->mc_ki[mc->mc_top] == mc->mc_ki[mc->mc_top])
{ {
MDB_node *leaf = NODEPTR(np, 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; return rc;
mp = mc->mc_pg[mc->mc_top]; mp = mc->mc_pg[mc->mc_top];
if (IS_LEAF2(mp))
goto del_key;
leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]); 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 (!(flags & MDB_NODUPDATA)) {
if (!F_ISSET(leaf->mn_flags, F_SUBDATA)) { if (!F_ISSET(leaf->mn_flags, F_SUBDATA)) {
mc->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(leaf); 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 */ /* 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; MDB_page *omp;
pgno_t pg; pgno_t pg;
@ -6361,6 +6364,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
return rc; return rc;
} }
del_key:
return mdb_cursor_del0(mc); return mdb_cursor_del0(mc);
} }

Loading…
Cancel
Save