@@ -138,8 +138,6 @@ static LatchState latch_buffer(thread_db*, Sync&, BufferDesc*, const PageNumber,
138138static LockState lock_buffer (thread_db*, BufferDesc*, const SSHORT, const SCHAR);
139139static ULONG memory_init (thread_db*, BufferControl*, SLONG);
140140static 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);
143141static void purgePrecedence (BufferControl*, BufferDesc*);
144142static SSHORT related (BufferDesc*, const BufferDesc*, SSHORT, const ULONG);
145143static 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
45104396static void prefetch_epilogue (Prefetch* prefetch, FbStatusVector* status_vector)
45114397{
0 commit comments