diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-04 00:32:57 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-04 00:32:57 +0000 |
commit | 8fe728b0094e8364e82b4a58c92265c00f4a2d1b (patch) | |
tree | f9257ea3c0961f7ea7e4589c309f30a0012db020 /src/backend/storage/buffer/bufmgr.c | |
parent | a880697f097b26c196d3e0cd079a03821deac95b (diff) | |
download | postgresql-8fe728b0094e8364e82b4a58c92265c00f4a2d1b.tar.gz postgresql-8fe728b0094e8364e82b4a58c92265c00f4a2d1b.zip |
Back-patch changes to validate page header fields immediately after
reading in any page. Also back-port the zero_damaged_pages boolean
that determines what to do about it.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 6d1e52d5220..35b1db79e84 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.133 2002/09/14 19:59:20 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.133.2.1 2003/04/04 00:32:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -49,6 +49,7 @@ #include "miscadmin.h" #include "storage/buf_internals.h" #include "storage/bufmgr.h" +#include "storage/bufpage.h" #include "storage/proc.h" #include "storage/smgr.h" #include "utils/relcache.h" @@ -59,6 +60,10 @@ (*((XLogRecPtr*) MAKE_PTR((bufHdr)->data))) +/* GUC variable */ +bool zero_damaged_pages = false; + + static void WaitIO(BufferDesc *buf); static void StartBufferIO(BufferDesc *buf, bool forInput); static void TerminateBufferIO(BufferDesc *buf); @@ -217,6 +222,20 @@ ReadBufferInternal(Relation reln, BlockNumber blockNum, { status = smgrread(DEFAULT_SMGR, reln, blockNum, (char *) MAKE_PTR(bufHdr->data)); + /* check for garbage data */ + if (status == SM_SUCCESS && + !PageHeaderIsValid((PageHeader) MAKE_PTR(bufHdr->data))) + { + if (zero_damaged_pages) + { + elog(WARNING, "Invalid page header in block %u of %s; zeroing out page", + blockNum, RelationGetRelationName(reln)); + MemSet((char *) MAKE_PTR(bufHdr->data), 0, BLCKSZ); + } + else + elog(ERROR, "Invalid page header in block %u of %s", + blockNum, RelationGetRelationName(reln)); + } } if (isLocalBuf) |