Compare commits

...

2 Commits

Author SHA1 Message Date
drh d160c0cf5b Another approach at attempting to contain the damage caused by corruption
that leaves MemPage.isInit clear.  Works better than the previous but is
still not perfect.

FossilOrigin-Name: ba964eb0f3dac957367bc03cb3800800e8f2758403467bdbfb44e7e1a7d9cebf
2023-03-16 02:30:43 +00:00
drh 45fcdcb05f When the btreeInitPage() routine detects database corruption, it should
continue to the end and set MemPage.isInit before it returns SQLITE_CORRUPT,
because if it leaves MemPage.isInit unset, then can cause difficulty later.
dbsqlfuzz 460aa158f9a2c41145831cc924296cde1f312b3f

FossilOrigin-Name: 44e83f8b8fab5b46fd50461b5bad9b31437607f259e8b284852ca3be0d376c8a
2023-03-16 01:20:03 +00:00
3 changed files with 18 additions and 15 deletions
+6 -6
View File
@@ -1,5 +1,5 @@
C Disallow\sthe\sone-pass\soptimization\sfor\sDELETE\sif\sthe\sWHERE\sclause\scontains\na\ssubquery.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/e61252062c9d286d|forum\spost\se61252062c9d286d].\s\sThis\sfix\nis\smore\srestrictive\sthan\snecessary.\s\sIt\scould\sbe\srelaxed\sif\sthe\ssubquery\sdoes\nnot\sinvolve\sthe\stable\sthat\sis\sthe\ssubject\sof\sthe\sDELETE.
D 2023-03-15T17:58:51.689
C Another\sapproach\sat\sattempting\sto\scontain\sthe\sdamage\scaused\sby\scorruption\nthat\sleaves\sMemPage.isInit\sclear.\s\sWorks\sbetter\sthan\sthe\sprevious\sbut\sis\nstill\snot\sperfect.
D 2023-03-16T02:30:43.826
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -564,7 +564,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
F src/btree.c c547e099f853de61835ff45da8d956a932d02ecf1ffd472a1f2a103b83e6dd40
F src/btree.c b7318b5a3cb40a1a42d0a42e175783a02c88a1ef4972b20fba93fd0e237e0781
F src/btree.h aa354b9bad4120af71e214666b35132712b8f2ec11869cb2315c52c81fad45cc
F src/btreeInt.h 06bb2c1a07172d5a1cd27a2a5d617b93b1e976c5873709c31964786f86365a6e
F src/build.c 4fed662d383527c808d85f53b9c544ead425ac8b9c7cb38501a64e3797921d41
@@ -2050,8 +2050,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 4c4e66f293d7768cceb875a936ca0f4cd910473e20b9910698cc1e1ce221a7d4
R 934d92c186df99d22e77975c034c41b7
P 44e83f8b8fab5b46fd50461b5bad9b31437607f259e8b284852ca3be0d376c8a
R 333e88ec9c338e26ffc59fb44537a76f
U drh
Z 54012e32e8462771957ea3ef7763a915
Z 5abd6e9065f4915bbe0135e8f0ac1b31
# Remove this line to create a well-formed Fossil manifest.
+1 -1
View File
@@ -1 +1 @@
73f0036f045bf37193b6e87ae45b578c5831614c530488257c69666178da3aa5
ba964eb0f3dac957367bc03cb3800800e8f2758403467bdbfb44e7e1a7d9cebf
+11 -8
View File
@@ -2142,6 +2142,7 @@ static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){
static int btreeInitPage(MemPage *pPage){
u8 *data; /* Equal to pPage->aData */
BtShared *pBt; /* The main btree structure */
int rc = SQLITE_OK;
assert( pPage->pBt!=0 );
assert( pPage->pBt->db!=0 );
@@ -2155,7 +2156,14 @@ static int btreeInitPage(MemPage *pPage){
data = pPage->aData + pPage->hdrOffset;
/* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating
** the b-tree page type. */
if( decodeFlags(pPage, data[0]) ){
pPage->nCell = get2byte(&data[3]);
if( decodeFlags(pPage, data[0]) || pPage->nCell>MX_CELL(pBt) ){
BtCursor *pCur;
for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){
sqlite3BtreeClearCursor(pCur);
pCur->eState = CURSOR_FAULT;
pCur->skipNext = SQLITE_CORRUPT;
}
return SQLITE_CORRUPT_PAGE(pPage);
}
assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
@@ -2167,11 +2175,6 @@ static int btreeInitPage(MemPage *pPage){
pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
/* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
** number of cells on the page. */
pPage->nCell = get2byte(&data[3]);
if( pPage->nCell>MX_CELL(pBt) ){
/* To many cells for a single page. The page must be corrupt */
return SQLITE_CORRUPT_PAGE(pPage);
}
testcase( pPage->nCell==MX_CELL(pBt) );
/* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only
** possible for a root page of a table that contains no rows) then the
@@ -2183,9 +2186,9 @@ static int btreeInitPage(MemPage *pPage){
pPage->nFree = -1; /* Indicate that this value is yet uncomputed */
pPage->isInit = 1;
if( pBt->db->flags & SQLITE_CellSizeCk ){
return btreeCellSizeCheck(pPage);
rc = btreeCellSizeCheck(pPage);
}
return SQLITE_OK;
return rc;
}
/*