]> git.sur5r.net Git - openldap/commitdiff
Fix 205bb17793e27be67098ccc80ee919165d7cb993
authorHoward Chu <hyc@symas.com>
Thu, 26 Jul 2012 14:22:52 +0000 (07:22 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 26 Jul 2012 14:22:52 +0000 (07:22 -0700)
Ignore current cursor pos if it's out of bounds.

libraries/libmdb/mdb.c

index b5952da849689405b813a9bb208dc7475ca99ca9..85bacdac7e028cb4d3e5e10cfb4a31d55f9765e7 100644 (file)
@@ -3858,20 +3858,22 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *key, MDB_val *data,
                                        goto set1;
                                }
                                if (rc < 0) {
-                                       /* This is definitely the right page, skip search_page */
-                                       if (mp->mp_flags & P_LEAF2) {
-                                               nodekey.mv_data = LEAF2KEY(mp,
-                                                        mc->mc_ki[mc->mc_top], nodekey.mv_size);
-                                       } else {
-                                               leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
-                                               MDB_SET_KEY(leaf, &nodekey);
-                                       }
-                                       rc = mc->mc_dbx->md_cmp(key, &nodekey);
-                                       if (rc == 0) {
-                                               /* current node was the one we wanted */
-                                               if (exactp)
-                                                       *exactp = 1;
-                                               goto set1;
+                                       if (mc->mc_ki[mc->mc_top] < NUMKEYS(mp)) {
+                                               /* This is definitely the right page, skip search_page */
+                                               if (mp->mp_flags & P_LEAF2) {
+                                                       nodekey.mv_data = LEAF2KEY(mp,
+                                                                mc->mc_ki[mc->mc_top], nodekey.mv_size);
+                                               } else {
+                                                       leaf = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
+                                                       MDB_SET_KEY(leaf, &nodekey);
+                                               }
+                                               rc = mc->mc_dbx->md_cmp(key, &nodekey);
+                                               if (rc == 0) {
+                                                       /* current node was the one we wanted */
+                                                       if (exactp)
+                                                               *exactp = 1;
+                                                       goto set1;
+                                               }
                                        }
                                        rc = 0;
                                        goto set2;