From: dan Date: Wed, 11 Oct 2017 18:21:44 +0000 (+0000) Subject: Check that the leaf count on each freelist trunk page is in range as part of X-Git-Tag: version-3.21.0~9^2~12^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7d157f91f4a29e8f237f1f1d0705271a3fe45f5f;p=thirdparty%2Fsqlite.git Check that the leaf count on each freelist trunk page is in range as part of checkfreelist processing. FossilOrigin-Name: 4e89406248f51d3b83d61e5472fb493f3d3b4ff2a69bf256c7e15445eeb2f3ec --- diff --git a/ext/misc/checkfreelist.c b/ext/misc/checkfreelist.c index cec03b7999..345f26c223 100644 --- a/ext/misc/checkfreelist.c +++ b/ext/misc/checkfreelist.c @@ -170,6 +170,14 @@ static int checkFreelist( u32 iNext = get4byte(&aData[0]); u32 nLeaf = get4byte(&aData[4]); + if( nLeaf>((nData/4)-2-6) ){ + rc = checkFreelistError(pzOut, + "leaf count out of range (%d) on trunk page %d", + (int)nLeaf, (int)iTrunk + ); + nLeaf = (nData/4) - 2 - 6; + } + nFree += 1+nLeaf; if( iNext>nPage ){ rc = checkFreelistError(pzOut, diff --git a/manifest b/manifest index d4e28e2d73..7a6b18c230 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\sextension\s"checkfreelist",\swhich\suses\ssqlite_dbpage\sto\scheck\sthat\nthere\sare\sno\sinvalid\sentries\son\sthe\sdatabase\sfree-list. -D 2017-10-11T18:00:34.689 +C Check\sthat\sthe\sleaf\scount\son\seach\sfreelist\strunk\spage\sis\sin\srange\sas\spart\sof\ncheckfreelist\sprocessing. +D 2017-10-11T18:21:44.429 F Makefile.in 05d02ce8606a9e46cd413d0bb46873fe597e5e41f52c4110241c11e60adff018 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 148d7cd36e556f5c257232cd93c71a1dd32c880d964c7d714990d677cd094589 @@ -259,7 +259,7 @@ F ext/misc/README.md 8e008c8d2b02e09096b31dfba033253ac27c6c06a18aa5826e299fa7601 F ext/misc/amatch.c 6db4607cb17c54b853a2d7c7c36046d004853f65b9b733e6f019d543d5dfae87 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 -F ext/misc/checkfreelist.c 043fdcc710f4147ff1deaf1bd6ea0a1c3eccb665ddd30d5623823a8eb4817eea w ext/misc/freelistchecker.c +F ext/misc/checkfreelist.c fc46557e73a6233bd698815d3963acc44bf4dba0ca9c91c90be361cca49d6b3e F ext/misc/closure.c 0d2a038df8fbae7f19de42e7c7d71f2e4dc88704 F ext/misc/completion.c 52c3f01523e3e387eb321b4739a89d1fe47cbe6025aa1f2d8d3685e9e365df0f F ext/misc/compress.c 122faa92d25033d6c3f07c39231de074ab3d2e83 @@ -648,7 +648,7 @@ F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 4c275cbdc8202d6f9c54a3596701719868ac7dc3 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test 33a698e8c63613449d85d624a38ef669bf20331daabebe3891c9405dd6df463a -F test/checkfreelist.test 6324b0a279eb101d698b31c12a65767b25f9b5c66d0d424943ae002e01f0de2f +F test/checkfreelist.test 100283a3e6b8a3018c7fab7cfdaf03d1d6540fc66453114e248cf82b25784d3b F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8 F test/closure01.test b1703ba40639cfc9b295cf478d70739415eec6a4 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 @@ -1660,7 +1660,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 497409e167c7c025fbddc319b4fa9a8b965f70d05ac88c060dee469f70321388 -R 7024a507e1ac7d6985bebba168f4b31f +P 21930ef5376261d95fa325be7761d327a350d4ae6b4573c83ddb4d294dea51c4 +R f25a07255c10ac9143e97a5d9d8e737e U dan -Z 54a66c878cf2157bd3590abc0ee2a612 +Z fe2b858df1a95da0fbc85fd6ca1ee6ea diff --git a/manifest.uuid b/manifest.uuid index e6ec495019..a9df98f06f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21930ef5376261d95fa325be7761d327a350d4ae6b4573c83ddb4d294dea51c4 \ No newline at end of file +4e89406248f51d3b83d61e5472fb493f3d3b4ff2a69bf256c7e15445eeb2f3ec \ No newline at end of file diff --git a/test/checkfreelist.test b/test/checkfreelist.test index f16d8b57bb..93e4ecc234 100644 --- a/test/checkfreelist.test +++ b/test/checkfreelist.test @@ -110,5 +110,14 @@ do_execsql_test 1.10 { ROLLBACK; } {{leaf page 0 is out of range (child 247 of trunk page 5)}} +do_execsql_test 1.11 { + BEGIN; + UPDATE sqlite_dbpage + SET data = set_int(data, 1, 249) + WHERE pgno=5; + SELECT checkfreelist('main'); + ROLLBACK; +} {{leaf count out of range (249) on trunk page 5}} + finish_test