https://bugs.openldap.org/show_bug.cgi?id=9291

--- Comment #3 from Markus <[email protected]> ---
I digged deeper and found the actual cause for the SIGBUS and it which might be
simple to detect. In short, a meta page points to a page beyond the file.

We could detect this in mdb_env_map and thus avoid the SIGBUS like this (first
two lines exist and are for context):

        env->me_metas[0] = METADATA(p);
        env->me_metas[1] = (MDB_meta *)((char *)env->me_metas[0] +
env->me_psize);

        mdb_size_t fsize;
        if(mdb_fsize(env->me_fd, &fsize) == MDB_SUCCESS && fsize) {
                pgno_t maxpgno = fsize / env->me_psize;
                if(env->me_metas[0]->mm_dbs[FREE_DBI].md_root > maxpgno ||
                   env->me_metas[0]->mm_dbs[MAIN_DBI].md_root > maxpgno ||
                   env->me_metas[1]->mm_dbs[FREE_DBI].md_root > maxpgno ||
                   env->me_metas[1]->mm_dbs[MAIN_DBI].md_root > maxpgno) {
                        return MDB_PAGE_NOTFOUND;
                }
        }

Would that basic consistency check work for you?

Some background: file size was 2232320 (545 pages) and thus this new code
caught the bad root at page 554. On odd thing was that I was able to see only
500 pages in the debugger's memory view; page 501 was already inaccessible.
Didn't proceed there however...

-- 
You are receiving this mail because:
You are on the CC list for the issue.

Reply via email to