aboutsummaryrefslogtreecommitdiff
path: root/src/backup.c
diff options
context:
space:
mode:
authordan <Dan Kennedy>2023-04-19 17:07:35 +0000
committerdan <Dan Kennedy>2023-04-19 17:07:35 +0000
commit3115b36d67ff3b15ca87c11c1b2291371a52d39c (patch)
tree4bd14c2fa5e3f98a4b722bd43d6c9abbd55b5fe3 /src/backup.c
parent2c5c124064103fe92548c4854be5c18a4bdbe162 (diff)
downloadsqlite-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.c13
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;
}