From a1085f06402378a4a46b0ffe63efc219e9471806 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 11 Jul 2020 16:42:28 +0000 Subject: [PATCH] Improved detection of a corrupt database schema. Fix for a problem discovered by dbsqlfuzz. FossilOrigin-Name: 30735432bc33cb953b6d7d2a2de9eb378f9740e0e663f50c727c3f138cd43a2b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 +++++- test/fuzzdata8.db | Bin 1523712 -> 1526784 bytes 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f6a1015369..207e47c191 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Remove\sunnecessary\scode\sfrom\sthe\swindow\sfunctions\simplementation. -D 2020-07-10T21:43:53.474 +C Improved\sdetection\sof\sa\scorrupt\sdatabase\sschema.\sFix\sfor\sa\sproblem\sdiscovered\nby\sdbsqlfuzz. +D 2020-07-11T16:42:28.397 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -13,7 +13,7 @@ F ext/lsm1/lsm_unix.c 11e0a5c19d754a4e1d93dfad06de8cc201f10f886b8e61a4c599ed34e3 F ext/misc/decimal.c c1897f624893d1c12e3c879d97ca7d1c4a36cae10d32afe632779de78c4aaa4f F ext/misc/ieee754.c bb6bd8e9eeeda5a7ac82839fcab5c0b8156b0532165387cc5458a97f60047b5d F main.mk b1cd0bc6aedad7ebb667b7f74f835f932f60ee33be2a5c3051fd93eb465f5c75 -F src/btree.c e8e4a7e4727f0ead6433fdafeff347bf078fec39bee55a24441c3481e5b85164 +F src/btree.c e8a64df5ebd1e9d5184ff89fc110e048cdf7b77cc300eb51c48969ef4e71c23b F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf F src/build.c ba1bbe563a3dc02d5fed20537603181e5289c13ea30ae5e775f552e7557adbfa F src/expr.c 73bd71448acb4f9a69c8c05e30281a9e982bb7de8f91a9c93b742dec09280442 @@ -36,7 +36,7 @@ F test/decimal.test 12739a01bdba4c4d79f95b323e6b67b9fad1ab6ffb56116bd2b9c81a5b19 F test/filter1.test 6c483ecf7886c8843a8612c021aa23f33c581f584151f251842b3a3592c95ac8 F test/fkey5.test 321fd41e8754389526b2b8e8769348dc9ff23a65d4d48b19c27df17459e82ec5 F test/fts3corrupt4.test b77dcdfa207c11d7966e71837c518cb0639c78fd109dec89c65d45a3bfd36701 -F test/fuzzdata8.db 0ae860b36b79fd41cafddc9e6602358b2d5c331cf200283221e659f86e196c0c +F test/fuzzdata8.db ef83ab1c8d130daabef304cb440bae2215208120de741b8476de66e16237808d F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0 F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e F test/speedtest1.c a8b5afe72d78ff365012aba48d3f0c579e957facb7630f765f58a6ae4656d20d @@ -47,7 +47,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P 5124732370fd53c93314c9c79b4251bd46ce81c2e7aa4f59e2c1889cc4263d5a -R ea3bc4c92fd2088a0776485a898bb94e +P 1e87da9c93309d1d69b1e0ab65c615b9ff9c1c6813ad0c7b90d2495be4ba0adc +R ff70a39063eed43e9dd438f7258ce866 U drh -Z 8fbb30c3fa3021d385b71d6a00620564 +Z d54b70f0c5aff12e31d9bd93382c262a diff --git a/manifest.uuid b/manifest.uuid index 739a48e326..b8d5fa2b63 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1e87da9c93309d1d69b1e0ab65c615b9ff9c1c6813ad0c7b90d2495be4ba0adc \ No newline at end of file +30735432bc33cb953b6d7d2a2de9eb378f9740e0e663f50c727c3f138cd43a2b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 00915abec5..76069a33eb 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8772,7 +8772,11 @@ int sqlite3BtreeInsert( assert( pPage->intKey || pX->nKey>=0 ); assert( pPage->leaf || !pPage->intKey ); if( pPage->nFree<0 ){ - rc = btreeComputeFreeSpace(pPage); + if( pCur->eState>CURSOR_INVALID ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = btreeComputeFreeSpace(pPage); + } if( rc ) return rc; } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 77e2b9fa15a0bef2a790961f44f27ae4e126cf86..d45392ac7cee5a946f03d6ece6bfa3721c8a3997 100644 GIT binary patch delta 14991 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 delta 14785 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