Skip to content

Commit f507390

Browse files
committed
Rolled back fix for CORE-6528
1 parent 33e1f04 commit f507390

1 file changed

Lines changed: 15 additions & 129 deletions

File tree

src/jrd/cch.cpp

Lines changed: 15 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,6 @@ static LatchState latch_buffer(thread_db*, Sync&, BufferDesc*, const PageNumber,
138138
static LockState lock_buffer(thread_db*, BufferDesc*, const SSHORT, const SCHAR);
139139
static ULONG memory_init(thread_db*, BufferControl*, SLONG);
140140
static void page_validation_error(thread_db*, win*, SSHORT);
141-
inline void page_validate(thread_db*, win*, const LockState, SSHORT);
142-
static void validate_read_page(thread_db*, win*, SSHORT);
143141
static void purgePrecedence(BufferControl*, BufferDesc*);
144142
static SSHORT related(BufferDesc*, const BufferDesc*, SSHORT, const ULONG);
145143
static bool writeable(BufferDesc*);
@@ -749,7 +747,10 @@ pag* CCH_fetch(thread_db* tdbb, WIN* window, int lock_type, SCHAR page_type, int
749747

750748
adjust_scan_count(window, lockState == lsLocked);
751749

752-
page_validate(tdbb, window, lockState, page_type);
750+
// Validate the fetched page matches the expected type
751+
752+
if (bdb->bdb_buffer->pag_type != page_type && page_type != pag_undefined)
753+
page_validation_error(tdbb, window, page_type);
753754

754755
return window->win_buffer;
755756
}
@@ -1411,7 +1412,10 @@ pag* CCH_handoff(thread_db* tdbb, WIN* window, ULONG page, int lock, SCHAR page_
14111412

14121413
adjust_scan_count(window, must_read == lsLocked);
14131414

1414-
page_validate(tdbb, window, must_read, page_type);
1415+
// Validate the fetched page matches the expected type
1416+
1417+
if (bdb->bdb_buffer->pag_type != page_type && page_type != pag_undefined)
1418+
page_validation_error(tdbb, window, page_type);
14151419

14161420
return window->win_buffer;
14171421
}
@@ -4353,7 +4357,7 @@ static ULONG memory_init(thread_db* tdbb, BufferControl* bcb, SLONG number)
43534357
}
43544358

43554359

4356-
static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type, Arg::StatusVector& err)
4360+
static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type)
43574361
{
43584362
/**************************************
43594363
*
@@ -4372,140 +4376,22 @@ static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type, Arg
43724376
**************************************/
43734377
SET_TDBB(tdbb);
43744378
BufferDesc* bdb = window->win_bdb;
4379+
const pag* page = bdb->bdb_buffer;
43754380
PageSpace* pages =
43764381
tdbb->getDatabase()->dbb_page_manager.findPageSpace(bdb->bdb_page.getPageSpaceID());
43774382

43784383
ERR_build_status(tdbb->tdbb_status_vector,
4379-
Arg::Gds(isc_db_corrupt) << Arg::Str(pages->file->fil_string) << err);
4384+
Arg::Gds(isc_db_corrupt) << Arg::Str(pages->file->fil_string) <<
4385+
Arg::Gds(isc_page_type_err) <<
4386+
Arg::Gds(isc_badpagtyp) << Arg::Num(bdb->bdb_page.getPageNum()) <<
4387+
pagtype(type) <<
4388+
pagtype(page->pag_type));
43804389

43814390
// We should invalidate this bad buffer.
43824391
CCH_unwind(tdbb, true);
43834392
}
43844393

43854394

4386-
inline void page_validate(thread_db* tdbb, WIN* window, const LockState ls, SSHORT type)
4387-
{
4388-
// Validate only when required page type is known and page was read from disk
4389-
if (type != pag_undefined && ls == lsLocked)
4390-
validate_read_page(tdbb, window, type);
4391-
}
4392-
4393-
4394-
static void validate_read_page(thread_db* tdbb, WIN* window, SSHORT type)
4395-
{
4396-
// Validate the fetched page matches the expected type
4397-
if (window->win_buffer->pag_type != type)
4398-
{
4399-
BufferDesc* bdb = window->win_bdb;
4400-
const pag* page = bdb->bdb_buffer;
4401-
4402-
page_validation_error(tdbb, window, type,
4403-
Arg::Gds(isc_page_type_err) <<
4404-
Arg::Gds(isc_badpagtyp) << Arg::Num(bdb->bdb_page.getPageNum()) << pagtype(type) << pagtype(page->pag_type));
4405-
}
4406-
4407-
switch(type)
4408-
{
4409-
case pag_root:
4410-
{
4411-
index_root_page* pg = (index_root_page*) window->win_buffer;
4412-
4413-
// check RPT size correctness
4414-
FB_UINT64 rptSize = sizeof(index_root_page) - sizeof(index_root_page::irt_repeat);
4415-
rptSize += FB_UINT64(pg->irt_count) * sizeof(index_root_page::irt_repeat);
4416-
if (rptSize > tdbb->getDatabase()->dbb_page_size)
4417-
{
4418-
page_validation_error(tdbb, window, type,
4419-
Arg::Gds(isc_random) << "Bad index root page: too many indices");
4420-
}
4421-
4422-
// check keys location on page
4423-
for (USHORT i = 0; i < pg->irt_count; ++i)
4424-
{
4425-
index_root_page::irt_repeat* rpt = &pg->irt_rpt[i];
4426-
if (!rpt->getRoot())
4427-
continue;
4428-
4429-
FB_UINT64 descEnd = rpt->irt_desc;
4430-
descEnd += FB_UINT64(rpt->irt_keys) * sizeof(irtd);
4431-
if (descEnd > tdbb->getDatabase()->dbb_page_size)
4432-
{
4433-
page_validation_error(tdbb, window, type,
4434-
Arg::Gds(isc_random) << "Bad index root page: keys run out of page");
4435-
}
4436-
}
4437-
4438-
break;
4439-
}
4440-
4441-
case pag_blob:
4442-
{
4443-
blob_page* pg = (blob_page*) window->win_buffer;
4444-
4445-
// check used space size correctness
4446-
FB_UINT64 usedSpace = sizeof(blob_page) - sizeof(ULONG);
4447-
usedSpace += FB_UINT64(pg->blp_length);
4448-
if (usedSpace > tdbb->getDatabase()->dbb_page_size)
4449-
{
4450-
page_validation_error(tdbb, window, type,
4451-
Arg::Gds(isc_random) << "Bad blob page: data does not fit on page");
4452-
}
4453-
4454-
break;
4455-
}
4456-
4457-
case pag_data:
4458-
{
4459-
data_page* pg = (data_page*) window->win_buffer;
4460-
4461-
// check RPT size correctness
4462-
FB_UINT64 rptSize = sizeof(data_page) - sizeof(data_page::dpg_repeat);
4463-
rptSize += FB_UINT64(pg->dpg_count) * sizeof(data_page::dpg_repeat);
4464-
if (rptSize > tdbb->getDatabase()->dbb_page_size)
4465-
{
4466-
page_validation_error(tdbb, window, type,
4467-
Arg::Gds(isc_random) << "Bad data page: too many record fragments");
4468-
}
4469-
4470-
// check fragments location on page
4471-
for (USHORT i = 0; i < pg->dpg_count; ++i)
4472-
{
4473-
data_page::dpg_repeat* rpt = &pg->dpg_rpt[i];
4474-
if (!(rpt->dpg_offset && rpt->dpg_length))
4475-
continue;
4476-
4477-
FB_UINT64 fragEnd = rpt->dpg_offset;
4478-
fragEnd += rpt->dpg_length;
4479-
if (fragEnd > tdbb->getDatabase()->dbb_page_size)
4480-
{
4481-
page_validation_error(tdbb, window, type,
4482-
Arg::Gds(isc_random) << "Bad data page: record fragment runs out of page");
4483-
}
4484-
}
4485-
4486-
break;
4487-
}
4488-
4489-
case pag_pointer:
4490-
{
4491-
pointer_page* pg = (pointer_page*) window->win_buffer;
4492-
4493-
// check used space size correctness
4494-
FB_UINT64 usedSpace = sizeof(pointer_page) - sizeof(ULONG);
4495-
usedSpace += FB_UINT64(pg->ppg_count) * sizeof(ULONG);
4496-
if (usedSpace > tdbb->getDatabase()->dbb_page_size)
4497-
{
4498-
page_validation_error(tdbb, window, type,
4499-
Arg::Gds(isc_random) << "Bad pointer page: data page vector does not fit on page");
4500-
}
4501-
4502-
break;
4503-
}
4504-
4505-
}
4506-
}
4507-
4508-
45094395
#ifdef CACHE_READER
45104396
static void prefetch_epilogue(Prefetch* prefetch, FbStatusVector* status_vector)
45114397
{

0 commit comments

Comments
 (0)