]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an assert() failure in the recover extension triggered by a zero value as the...
authordan <Dan Kennedy>
Thu, 27 Oct 2022 18:35:09 +0000 (18:35 +0000)
committerdan <Dan Kennedy>
Thu, 27 Oct 2022 18:35:09 +0000 (18:35 +0000)
FossilOrigin-Name: 44c0874c33e76ce708022e5c38c74f75565a8cea9f4c5b067cc0a54079aeee20

ext/recover/dbdata.c
ext/recover/recovercorrupt2.test
manifest
manifest.uuid

index c92db0c66c8b939c1719b194fed7e6cbfd1cd5da..8b1489046184b182a9006a113f9bd03ae002e49d 100644 (file)
@@ -333,25 +333,27 @@ static int dbdataLoadPage(
 
   *ppPage = 0;
   *pnPage = 0;
-  sqlite3_bind_int64(pStmt, 2, pgno);
-  if( SQLITE_ROW==sqlite3_step(pStmt) ){
-    int nCopy = sqlite3_column_bytes(pStmt, 0);
-    if( nCopy>0 ){
-      u8 *pPage;
-      pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
-      if( pPage==0 ){
-        rc = SQLITE_NOMEM;
-      }else{
-        const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
-        memcpy(pPage, pCopy, nCopy);
-        memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
+  if( pgno>0 ){
+    sqlite3_bind_int64(pStmt, 2, pgno);
+    if( SQLITE_ROW==sqlite3_step(pStmt) ){
+      int nCopy = sqlite3_column_bytes(pStmt, 0);
+      if( nCopy>0 ){
+        u8 *pPage;
+        pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
+        if( pPage==0 ){
+          rc = SQLITE_NOMEM;
+        }else{
+          const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
+          memcpy(pPage, pCopy, nCopy);
+          memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
+        }
+        *ppPage = pPage;
+        *pnPage = nCopy;
       }
-      *ppPage = pPage;
-      *pnPage = nCopy;
     }
+    rc2 = sqlite3_reset(pStmt);
+    if( rc==SQLITE_OK ) rc = rc2;
   }
-  rc2 = sqlite3_reset(pStmt);
-  if( rc==SQLITE_OK ) rc = rc2;
 
   return rc;
 }
index 6b8fbeeeec5f661977c6c682b60426221164b321..1846eb64d085010876962c303d673404a05a0078 100644 (file)
@@ -112,6 +112,44 @@ do_execsql_test -db db2 2.3 {
 } {}
 db2 close
 
+#-------------------------------------------------------------------------
+#
+reset_db
+do_test 3.0 {
+  sqlite3 db {}
+  db deserialize [decode_hexdb {
+  .open --hexdb
+  | size 4096 pagesize 1024 filename corrupt032.txt.db
+  | page 1 offset 0
+  |      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
+  |     16: 04 00 01 01 08 40 20 20 00 00 00 02 00 00 00 03   .....@  ........
+  |     32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04   ................
+  |     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
+  |     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02   ................
+  |     96: 00 2e 24 80 0d 00 00 00 01 03 d4 00 03 d4 00 00   ..$.............
+  |    976: 00 00 00 00 22 01 06 17 11 11 01 31 74 61 62 6c   ...........1tabl
+  |    992: 65 74 31 74 31 02 43 52 45 41 54 45 20 54 41 42   et1t1.CREATE TAB
+  |   1008: 4c 45 20 74 31 28 78 29 00 00 00 00 00 00 00 00   LE t1(x)........
+  | page 2 offset 1024
+  |      0: 0d 00 00 00 01 02 06 00 02 06 00 00 00 00 00 00   ................
+  |    512: 00 00 00 00 00 00 8b 60 01 03 97 46 00 00 00 00   .......`...F....
+  |   1008: 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00   ................
+  | end corrupt032.txt.db
+}]} {}
+
+do_test 3.1 {
+  set R [sqlite3_recover_init db main test.db2]
+  $R run
+  $R finish
+} {}
+
+sqlite3 db2 test.db2
+do_execsql_test -db db2 3.2 {
+} {
+}
+do_execsql_test -db db2 3.3 {
+} {}
+db2 close
 
 finish_test
 
index 005502f33c33c25c34934256e87907fb7eeec54b..4ee7151f88e58c80c7b7f781f6e8d1adc0939fe1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sthe\sCLI,\sensure\sthat\sinput\sto\sutf8_width_print\sis\snot\sNULL,\sor\sif\sit\sis,\nchange\sit\sto\san\sempty\sstring.\s\sFor\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/2961cf13eec61876|forum\spost\s2961cf13eec61876].
-D 2022-10-27T18:20:08.411
+C Fix\san\sassert()\sfailure\sin\sthe\srecover\sextension\striggered\sby\sa\szero\svalue\sas\sthe\sfirst\spage-number\sin\san\soverflow\spage\schain.
+D 2022-10-27T18:35:09.479
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -385,12 +385,12 @@ F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2
 F ext/rbu/sqlite3rbu.c 8737cabdfbee84bb25a7851ecef8b1312be332761238da9be6ddb10c62ad4291
 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812
 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a
-F ext/recover/dbdata.c e2cb4c88ba97a1617d78fe2d8adfde7b3e5ad8bca902b691938e5cc0bae92e2d
+F ext/recover/dbdata.c a7b75b53054d131355cb62fd00643fdafc561dfd1e9e9dd0710778e690579853
 F ext/recover/recover1.test e08dc7a0513eab9de33e7b8e2260b9538bedb57c9bd6fbb278f328d29a102827
 F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c
 F ext/recover/recoverclobber.test 294dcc894124ab4ca3a7b35766630742a3d25810fceac22220beb64f70a33a60
 F ext/recover/recovercorrupt.test 6540aae95e17398dd70b44518367fd56588c44962cb276d2623a0fedba9efe9e
-F ext/recover/recovercorrupt2.test dff0c9f52888ae5956b1892ce502db42e6f51a666230369251bbbca923be541f
+F ext/recover/recovercorrupt2.test aae5329bd5e773895ad426a72100b290c06cc855704c7c7561369ea03742b5f0
 F ext/recover/recoverfault.test 3a0a32b9fc216592b97775d69220695b0926980c0f7424b7a59144e47d7cb568
 F ext/recover/recoverfault2.test 321036336af23e778a87f148c4cc4407f88fbdab1fd72ddb661669be9020d36b
 F ext/recover/recoverold.test 46e9d99b595fac583d4c67f74d7d89c20a435c752ef6eeb3e918b599940c88e0
@@ -2052,8 +2052,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P afce8443ace57c3c99c6810be98f05ed716ae504b68098726c869843c643bbf0
-R e55959c410fb52f7ad34ecde96c130d2
-U drh
-Z 207dea69502bccb805e97d5ac064979f
+P 9ecc9d25ea62a7777bbf621989a5c577b612784121a20465cda4d4023fa9634d
+R 3096a83bfa4b844f97735d498da01d52
+U dan
+Z ed22d20a006d2a515bbb5bbd662f21b3
 # Remove this line to create a well-formed Fossil manifest.
index 72e567ed62a750e6278fa70bd1410080858c7fa7..09daa9a1383eff9c32e757a1bc480d8521615863 100644 (file)
@@ -1 +1 @@
-9ecc9d25ea62a7777bbf621989a5c577b612784121a20465cda4d4023fa9634d
\ No newline at end of file
+44c0874c33e76ce708022e5c38c74f75565a8cea9f4c5b067cc0a54079aeee20
\ No newline at end of file