Index: lsm-test/lsmtest8.c ================================================================== --- lsm-test/lsmtest8.c +++ lsm-test/lsmtest8.c @@ -303,12 +303,12 @@ void do_writer_crash_test(const char *zPattern, int *pRc){ struct Test { const char *zName; void (*xFunc)(int *); } aTest[] = { - { "writercrash2.lsm", doWriterCrash2 }, { "writercrash1.lsm", doWriterCrash1 }, + { "writercrash2.lsm", doWriterCrash2 }, }; int i; for(i=0; izName) ){ Index: src/lsm_tree.c ================================================================== --- src/lsm_tree.c +++ src/lsm_tree.c @@ -1175,16 +1175,20 @@ p = treeShmChunkRc(db, db->treehdr.iFirst, &rc); iShmid = p->iShmid; while( rc==LSM_OK && p ){ if( p->iNext ){ - ShmChunk *pNext = treeShmChunkRc(db, p->iNext, &rc); - if( rc==LSM_OK ){ - if( pNext->iShmid!=p->iShmid+1 ){ - rc = LSM_CORRUPT_BKPT; + if( p->iNext>=db->treehdr.nChunk ){ + rc = LSM_CORRUPT_BKPT; + }else{ + ShmChunk *pNext = treeShmChunkRc(db, p->iNext, &rc); + if( rc==LSM_OK ){ + if( pNext->iShmid!=p->iShmid+1 ){ + rc = LSM_CORRUPT_BKPT; + } + p = pNext; } - p = pNext; } }else{ p = 0; } nVisit++; @@ -1264,11 +1268,11 @@ nByte = sizeof(ShmChunkLoc) * nSort * 2; aSort = lsmMallocZeroRc(db->pEnv, nByte, &rc); iPrevShmid = pMin->iShmid; /* Fix all shm-ids, if required. */ - if( rc==LSM_OK && iMin!=db->treehdr.iFirst ){ + if( rc==LSM_OK ){ iPrevShmid = pMin->iShmid-1; for(i=1; itreehdr.nChunk; i++){ p = treeShmChunk(db, i); aSort[i-1].pShm = p; aSort[i-1].iLoc = i; @@ -1276,12 +1280,14 @@ if( shm_sequence_ge(p->iShmid, db->treehdr.iNextShmid) ){ p->iShmid = iPrevShmid--; } } } - p = treeShmChunk(db, db->treehdr.iFirst); - p->iShmid = iPrevShmid; + if( iMin!=db->treehdr.iFirst ){ + p = treeShmChunk(db, db->treehdr.iFirst); + p->iShmid = iPrevShmid; + } } if( rc==LSM_OK ){ ShmChunkLoc *aSpace = &aSort[nSort]; for(i=0; i