Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a buffer overrun occuring when many overflow pages are recycled by a merge operation. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
28340557fc88d445e0fe985f5dfabe40 |
User & Date: | dan 2014-02-05 20:05:05.463 |
Context
2014-02-08
| ||
10:51 | Fixes so that tcl tests run with bt. check-in: b7f86e5617 user: dan tags: trunk | |
2014-02-05
| ||
20:05 | Fix a buffer overrun occuring when many overflow pages are recycled by a merge operation. check-in: 28340557fc user: dan tags: trunk | |
19:10 | Add extra tests and fixes. Make the block size and page size configurable. check-in: b43e752c98 user: dan tags: trunk | |
Changes
Changes to src/bt_main.c.
︙ | ︙ | |||
4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 | pgno = (p->nPgPerBlk * (p->iBlk-1) + 1) + p->nWrite; p->nWrite++; p->nAlloc++; rc = sqlite4BtPagerRawWrite(p->db->pPager, pgno, p->aTrunk); btPutU32(&p->aTrunk[4], pgno); if( pPgno ) *pPgno = pgno; return rc; } static int fiWriterFreeOverflow(FiWriter *p, FiCursor *pCsr){ const void *pKey; /* Buffer containing current key for pCsr */ | > | 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 | pgno = (p->nPgPerBlk * (p->iBlk-1) + 1) + p->nWrite; p->nWrite++; p->nAlloc++; rc = sqlite4BtPagerRawWrite(p->db->pPager, pgno, p->aTrunk); btPutU32(&p->aTrunk[4], pgno); if( pPgno ) *pPgno = pgno; p->nOvfl = 0; return rc; } static int fiWriterFreeOverflow(FiWriter *p, FiCursor *pCsr){ const void *pKey; /* Buffer containing current key for pCsr */ |
︙ | ︙ | |||
4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 | ){ u32 pgno = sqlite4BtPagePgno(pSub->apPage[pSub->nPg-1]); int iCell = pSub->aiCell[pSub->nPg-1]; if( p->aTrunk==0 ){ rc = btNewBuffer(p->db, &p->aTrunk); if( rc==SQLITE4_OK ) memset(p->aTrunk, 0, 8); }else if( p->nOvflPerPage==p->nOvfl ){ rc = fiWriterFlushOvfl(p, 0); } if( rc==SQLITE4_OK ){ btPutU32(&p->aTrunk[8 + p->nOvfl*8], pgno); btPutU32(&p->aTrunk[8 + p->nOvfl*8 + 4], iCell); p->nOvfl++; | > | 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 | ){ u32 pgno = sqlite4BtPagePgno(pSub->apPage[pSub->nPg-1]); int iCell = pSub->aiCell[pSub->nPg-1]; if( p->aTrunk==0 ){ rc = btNewBuffer(p->db, &p->aTrunk); if( rc==SQLITE4_OK ) memset(p->aTrunk, 0, 8); assert( p->nOvfl==0 ); }else if( p->nOvflPerPage==p->nOvfl ){ rc = fiWriterFlushOvfl(p, 0); } if( rc==SQLITE4_OK ){ btPutU32(&p->aTrunk[8 + p->nOvfl*8], pgno); btPutU32(&p->aTrunk[8 + p->nOvfl*8 + 4], iCell); p->nOvfl++; |
︙ | ︙ |