Skip to content

mdb_page_search_root Bus error #12

@xlisp

Description

@xlisp

GDB debug:
6c362419-6c45-4ae9-b1fb-f10c50bd52fd

If the word can be found, then it won't bus error. If the word can't be found, it will Bus error.
image

  • This is mdb_page_search_root:
 /** Finish #mdb_page_search() / #mdb_page_search_lowest().
  *   The cursor is at the root page, set up the rest of it.
  */
 static int
 mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
 {
      MDB_page        *mp = mc->mc_pg[mc->mc_top];
      int rc;
      DKBUF;

      while (IS_BRANCH(mp)) {
              MDB_node        *node;
              indx_t          i;

              DPRINTF(("branch page %"Yu" has %u keys", mp->mp_pgno, NUMKEYS(mp)));
              /* Don't assert on branch pages in the FreeDB. We can get here
               * while in the process of rebalancing a FreeDB branch page; we must
               * let that proceed. ITS#8336
               */
              mdb_cassert(mc, !mc->mc_dbi || NUMKEYS(mp) > 1);
              DPRINTF(("found index 0 to page %"Yu, NODEPGNO(NODEPTR(mp, 0))));

              if (flags & (MDB_PS_FIRST|MDB_PS_LAST)) {
                      i = 0;
                      if (flags & MDB_PS_LAST) {
                              i = NUMKEYS(mp) - 1;
                              /* if already init'd, see if we're already in right place */
                              if (mc->mc_flags & C_INITIALIZED) {
                                      if (mc->mc_ki[mc->mc_top] == i) {
                                              mc->mc_top = mc->mc_snum++;
                                              mp = mc->mc_pg[mc->mc_top];
                                              goto ready;
                                      }
                              }
                      }
              } else {
                      int      exact;
                      node = mdb_node_search(mc, key, &exact);
                      if (node == NULL)
                              i = NUMKEYS(mp) - 1;
                      else {
                              i = mc->mc_ki[mc->mc_top];
                              if (!exact) {
                                      mdb_cassert(mc, i > 0);
                                      i--;
                              }
                      }
                      DPRINTF(("following index %u for key [%s]", i, DKEY(key)));
              }

              mdb_cassert(mc, i < NUMKEYS(mp));
              node = NODEPTR(mp, i);

              if ((rc = mdb_page_get(mc, NODEPGNO(node), &mp, NULL)) != 0)
                      return rc;

              mc->mc_ki[mc->mc_top] = i;
              if ((rc = mdb_cursor_push(mc, mp)))
                      return rc;

 ready:
              if (flags & MDB_PS_MODIFY) {
                      if ((rc = mdb_page_touch(mc)) != 0)
                              return rc;
                      mp = mc->mc_pg[mc->mc_top];
              }
      }

      if (!IS_LEAF(mp)) {
              DPRINTF(("internal error, index points to a %02X page!?",
                  mp->mp_flags));
              mc->mc_txn->mt_flags |= MDB_TXN_ERROR;
              return MDB_CORRUPTED;
      }

      DPRINTF(("found leaf page %"Yu" for key [%s]", mp->mp_pgno,
          key ? DKEY(key) : "null"));
      mc->mc_flags |= C_INITIALIZED;
      mc->mc_flags &= ~C_EOF;

      return MDB_SUCCESS;
 }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions