]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a segfault that could occur if a non-empty in-memory database was the destination...
authordrh <>
Wed, 19 Apr 2023 17:13:26 +0000 (17:13 +0000)
committerdrh <>
Wed, 19 Apr 2023 17:13:26 +0000 (17:13 +0000)
FossilOrigin-Name: d37241585cf23b14695611a733fff4940db4c0501836e845dad17d2df0c8c22b

manifest
manifest.uuid
src/backup.c
test/backup.test

index f80c651732a5f4b85ae47b5e21c52c8717489f68..3d243d65add663519dd865de4ffe77758d159331 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\sremove\spages\sfrom\sthe\scache\sof\san\sin-memory\sdatabase\sdue\sto\sa\nfailure\sto\sacquire\sthe\spage\sdue\sto\sit\sbeing\slarger\sthan\sthe\smaximum\spage\nsize.
-D 2023-04-19T15:39:28.783
+C Fix\sa\ssegfault\sthat\scould\soccur\sif\sa\snon-empty\sin-memory\sdatabase\swas\sthe\sdestination\sof\sa\sbackup\soperation\sfrom\sa\sdatabase\swith\sa\ssmaller\spage\ssize.
+D 2023-04-19T17:13:26.831
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -557,7 +557,7 @@ F src/alter.c 482c534877fbb543f8295992cde925df55443febac5db5438d5aaba6f78c4940
 F src/analyze.c 8230fc1f3ddcf5492d258f28afcd36026c0de2f35cbbee22a41eed4baaf26148
 F src/attach.c cc9d00d30da916ff656038211410ccf04ed784b7564639b9b61d1839ed69fd39
 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
-F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
+F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
 F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
 F src/btree.c b56f7af31b11fa3f63099c388a45bd79e55e079df718a332a5fa716989ec8fd5
@@ -784,7 +784,7 @@ F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4
 F test/avfs.test 0c3a38e03cccb0fc3127838462dc05dc3f4c1480d770c084b388304c25de3652
 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e
 F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d
-F test/backup.test fc1ecefce723fad5199b55cec7a5a992ec8c3ad6873419e5e8919066dec457f3
+F test/backup.test 3b08fd4af69f0fa786931103a31f4542b184aba16e239e5f22b18c3c2476697f
 F test/backup2.test 8facb54df1388419d34b362ab1f7e233310ff3a3af64e8ad5ec47ba3c2bbe5cf
 F test/backup4.test 8f6fd48e0dfde77b9a3bb26dc471ede3e101df32
 F test/backup5.test ee5da6d7fe5082f5b9b0bbfa31d016f52412a2e4
@@ -2046,9 +2046,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 441f4e4a42796dc3fc9e16226cd2eb31d6575b10cdbba6e5283b11f3ecec2a65
-Q +982b35563da685dfdf50cbe4a7ae829d3b428e03587028df7efe520f819b1dc2
-R e6f3a9a26f7a32486df0a4dee696e2a9
+P 551b9dacd0e1c9edb028c8fc76904bf5c22e907ac4e5074b0df39a0de11e1227
+Q +020968f857d7b90bab3525fc9d6b859a019f6a80422c3d5ffb88f5bdb8e02a11
+R 21a08e488f1883bc3ed801b77fc1580b
 U drh
-Z 027fbd8afda6a7d373daf7d4db76145a
+Z c8eef2dde27845b217b24f4a234caeea
 # Remove this line to create a well-formed Fossil manifest.
index 26c0fa442d1d560ff3c0a50dbf5f5706f49acaa3..fe3134cc96ab22531f055c32f07b2bdcd5d0a294 100644 (file)
@@ -1 +1 @@
-551b9dacd0e1c9edb028c8fc76904bf5c22e907ac4e5074b0df39a0de11e1227
\ No newline at end of file
+d37241585cf23b14695611a733fff4940db4c0501836e845dad17d2df0c8c22b
\ No newline at end of file
index d9671750f40d9e011f16545f24173d064dec84c9..22615d1499b54ddf00f4ea8b0f83b804ebbc8ceb 100644 (file)
@@ -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;
     }
   
index 1572ded554ad262e997c742f77942fc25ca955b5..ad1a383a087aae9d64a38be7690f06655547ce60 100644 (file)
@@ -977,5 +977,28 @@ do_test backup-11.1 {
   sqlite3_backup B db1 main db2 temp
   B finish
 } {SQLITE_OK}
+db1 close
+db2 close
+
+#-------------------------------------------------------------------------
+do_test backup-12.1 {
+  sqlite3 db1 :memory:
+  sqlite3 db2 :memory:
+  db1 eval {
+    PRAGMA page_size = 8192;
+    CREATE TABLE t1(x);
+  }
+  db2 eval {
+    PRAGMA page_size = 1024;
+    CREATE TABLE t2(x);
+  }
+
+  sqlite3_backup B db1 main db2 temp
+  B step 100
+  B finish
+} {SQLITE_READONLY}
+
+
+
 
 finish_test