1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Prevent a possible infinite loop when trying to DROP a table from

a corrupt database.

FossilOrigin-Name: 395bb3e677a6551b06ba96fc58c393132b93d1e8
This commit is contained in:
drh
2015-03-30 23:43:56 +00:00
parent ad1e55e55a
commit 116f0be024
4 changed files with 94 additions and 10 deletions

View File

@@ -7978,6 +7978,7 @@ static int clearDatabasePage(
int i;
int hdr;
u16 szCell;
u8 hasChildren;
assert( sqlite3_mutex_held(pBt->mutex) );
if( pgno>btreePagecount(pBt) ){
@@ -7986,17 +7987,19 @@ static int clearDatabasePage(
rc = getAndInitPage(pBt, pgno, &pPage, 0);
if( rc ) return rc;
hasChildren = !pPage->leaf;
pPage->leaf = 1; /* Block looping if the database is corrupt */
hdr = pPage->hdrOffset;
for(i=0; i<pPage->nCell; i++){
pCell = findCell(pPage, i);
if( !pPage->leaf ){
if( hasChildren ){
rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
}
rc = clearCell(pPage, pCell, &szCell);
if( rc ) goto cleardatabasepage_out;
}
if( !pPage->leaf ){
if( hasChildren ){
rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
}else if( pnChange ){