]> git.sur5r.net Git - openldap/commitdiff
More for ITS#8406
authorHoward Chu <hyc@openldap.org>
Tue, 29 Nov 2016 19:19:45 +0000 (19:19 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 29 Nov 2016 19:19:45 +0000 (19:19 +0000)
xcursor fixup depends on init state

libraries/liblmdb/mdb.c

index 026019eb2dc5c02848dfea3a981c545b1261bc05..cb17f64021516dec8294f88dad231974f1115e0a 100644 (file)
@@ -9154,6 +9154,11 @@ mdb_cursor_del0(MDB_cursor *mc)
                        if (m3->mc_pg[mc->mc_top] == mp) {
                                if (m3->mc_ki[mc->mc_top] == ki) {
                                        m3->mc_flags |= C_DEL;
+                                       if (mc->mc_db->md_flags & MDB_DUPSORT) {
+                                               /* Sub-cursor referred into dataset which is gone */
+                                               m3->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
+                                       }
+                                       continue;
                                } else if (m3->mc_ki[mc->mc_top] > ki) {
                                        m3->mc_ki[mc->mc_top]--;
                                }
@@ -9199,10 +9204,14 @@ mdb_cursor_del0(MDB_cursor *mc)
                                        if (mc->mc_db->md_flags & MDB_DUPSORT) {
                                                MDB_node *node = NODEPTR(m3->mc_pg[m3->mc_top], m3->mc_ki[m3->mc_top]);
                                                /* If this node is a fake page, it needs to be reinited
-                                                * because its data has moved.
+                                                * because its data has moved. But just reset mc_pg[0]
+                                                * if the xcursor is already live.
                                                 */
                                                if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA) {
-                                                       mdb_xcursor_init1(m3, node);
+                                                       if (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)
+                                                               m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
+                                                       else
+                                                               mdb_xcursor_init1(m3, node);
                                                }
                                        }
                                }