aboutsummaryrefslogtreecommitdiff
path: root/src/btree.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-02-09 22:33:44 +0000
committerdrh <drh@noemail.net>2019-02-09 22:33:44 +0000
commit85a379b74b4229f9d6bf54936d2bc71c009929b9 (patch)
tree3925f77b9ce2f50005bb665c739c976f3ce5bd34 /src/btree.c
parentb0ea9432a12c01597951967a18e530df1b4bffd1 (diff)
downloadsqlite-85a379b74b4229f9d6bf54936d2bc71c009929b9.tar.gz
sqlite-85a379b74b4229f9d6bf54936d2bc71c009929b9.zip
Fix a page-cache reference leak in the btree balancer when there is a corrupt
database. FossilOrigin-Name: 9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c
Diffstat (limited to 'src/btree.c')
-rw-r--r--src/btree.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/btree.c b/src/btree.c
index 375d89189..1085bcc72 100644
--- a/src/btree.c
+++ b/src/btree.c
@@ -7550,13 +7550,17 @@ static int balance_nonroot(
pgno = get4byte(pRight);
while( 1 ){
rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0);
- if( rc==0 && apOld[i]->nFree<0 ){
- rc = btreeComputeFreeSpace(apOld[i]);
- }
if( rc ){
memset(apOld, 0, (i+1)*sizeof(MemPage*));
goto balance_cleanup;
}
+ if( apOld[i]->nFree<0 ){
+ rc = btreeComputeFreeSpace(apOld[i]);
+ if( rc ){
+ memset(apOld, 0, (i)*sizeof(MemPage*));
+ goto balance_cleanup;
+ }
+ }
nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow;
if( (i--)==0 ) break;