Skip to content

Commit d3ae9f4

Browse files
committed
Rolled back fix for CORE-6528
1 parent 56ae558 commit d3ae9f4

1 file changed

Lines changed: 16 additions & 130 deletions

File tree

src/jrd/cch.cpp

Lines changed: 16 additions & 130 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*);
@@ -750,7 +748,10 @@ pag* CCH_fetch(thread_db* tdbb, WIN* window, int lock_type, SCHAR page_type, int
750748

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

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

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

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

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

14171421
return window->win_buffer;
14181422
}
@@ -4360,7 +4364,7 @@ static ULONG memory_init(thread_db* tdbb, BufferControl* bcb, SLONG number)
43604364
}
43614365

43624366

4363-
static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type, Arg::StatusVector& err)
4367+
static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type)
43644368
{
43654369
/**************************************
43664370
*
@@ -4379,140 +4383,22 @@ static void page_validation_error(thread_db* tdbb, WIN* window, SSHORT type, Arg
43794383
**************************************/
43804384
SET_TDBB(tdbb);
43814385
BufferDesc* bdb = window->win_bdb;
4386+
const pag* page = bdb->bdb_buffer;
4387+
43824388
PageSpace* pages =
43834389
tdbb->getDatabase()->dbb_page_manager.findPageSpace(bdb->bdb_page.getPageSpaceID());
43844390

43854391
ERR_build_status(tdbb->tdbb_status_vector,
4386-
Arg::Gds(isc_db_corrupt) << Arg::Str(pages->file->fil_string) << err);
4387-
4392+
Arg::Gds(isc_db_corrupt) << Arg::Str(pages->file->fil_string) <<
4393+
Arg::Gds(isc_page_type_err) <<
4394+
Arg::Gds(isc_badpagtyp) << Arg::Num(bdb->bdb_page.getPageNum()) <<
4395+
pagtype(type) <<
4396+
pagtype(page->pag_type));
43884397
// We should invalidate this bad buffer.
43894398
CCH_unwind(tdbb, true);
43904399
}
43914400

43924401

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

0 commit comments

Comments
 (0)