diff options
author | dan <Dan Kennedy> | 2023-04-19 17:07:35 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2023-04-19 17:07:35 +0000 |
commit | 3115b36d67ff3b15ca87c11c1b2291371a52d39c (patch) | |
tree | 4bd14c2fa5e3f98a4b722bd43d6c9abbd55b5fe3 /src/backup.c | |
parent | 2c5c124064103fe92548c4854be5c18a4bdbe162 (diff) | |
download | sqlite-3115b36d67ff3b15ca87c11c1b2291371a52d39c.tar.gz sqlite-3115b36d67ff3b15ca87c11c1b2291371a52d39c.zip |
Fix a segfault that could occur if a non-empty in-memory database was the destination of a backup operation from a database with a smaller page size.
FossilOrigin-Name: 020968f857d7b90bab3525fc9d6b859a019f6a80422c3d5ffb88f5bdb8e02a11
Diffstat (limited to 'src/backup.c')
-rw-r--r-- | src/backup.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/src/backup.c b/src/backup.c index d9671750f..22615d149 100644 --- a/src/backup.c +++ b/src/backup.c @@ -242,13 +242,7 @@ static int backupOnePage( assert( !isFatalError(p->rc) ); assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); assert( zSrcData ); - - /* Catch the case where the destination is an in-memory database and the - ** page sizes of the source and destination differ. - */ - if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ - rc = SQLITE_READONLY; - } + assert( nSrcPgsz==nDestPgsz || sqlite3PagerIsMemdb(pDestPager)==0 ); /* This loop runs once for each destination page spanned by the source ** page. For each iteration, variable iOff is set to the byte offset @@ -381,7 +375,10 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); pgszDest = sqlite3BtreeGetPageSize(p->pDest); destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); - if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + if( SQLITE_OK==rc + && (destMode==PAGER_JOURNALMODE_WAL || sqlite3PagerIsMemdb(pDestPager)) + && pgszSrc!=pgszDest + ){ rc = SQLITE_READONLY; } |