From: dan Date: Thu, 27 Oct 2022 18:35:09 +0000 (+0000) Subject: Fix an assert() failure in the recover extension triggered by a zero value as the... X-Git-Tag: version-3.40.0~75 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=895f12dfe77f7b7a1f1cb17f517853573276d7bb;p=thirdparty%2Fsqlite.git Fix an assert() failure in the recover extension triggered by a zero value as the first page-number in an overflow page chain. FossilOrigin-Name: 44c0874c33e76ce708022e5c38c74f75565a8cea9f4c5b067cc0a54079aeee20 --- diff --git a/ext/recover/dbdata.c b/ext/recover/dbdata.c index c92db0c66c..8b14890461 100644 --- a/ext/recover/dbdata.c +++ b/ext/recover/dbdata.c @@ -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; } diff --git a/ext/recover/recovercorrupt2.test b/ext/recover/recovercorrupt2.test index 6b8fbeeeec..1846eb64d0 100644 --- a/ext/recover/recovercorrupt2.test +++ b/ext/recover/recovercorrupt2.test @@ -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 diff --git a/manifest b/manifest index 005502f33c..4ee7151f88 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 72e567ed62..09daa9a138 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ecc9d25ea62a7777bbf621989a5c577b612784121a20465cda4d4023fa9634d \ No newline at end of file +44c0874c33e76ce708022e5c38c74f75565a8cea9f4c5b067cc0a54079aeee20 \ No newline at end of file