diff options
author | Tom Lane | 2017-02-03 16:34:41 +0000 |
---|---|---|
committer | Tom Lane | 2017-02-03 16:34:47 +0000 |
commit | 14e9b18fed289e483ed28daec60fdab95da9cc48 (patch) | |
tree | 928ca1c449c1ba884748758d2d52959c3af76881 /contrib/pageinspect/hashfuncs.c | |
parent | 29e312bc1301061ae9f897ff39f3b230c421a5fb (diff) |
In pageinspect/hashfuncs.c, avoid crashes on alignment-picky machines.
On machines with MAXALIGN = 8, the payload of a bytea is not maxaligned,
since it will start 4 bytes into a palloc'd value. On alignment-picky
hardware, this will cause failures in accesses to 8-byte-wide values
within the page. We already encountered this problem when we introduced
GIN index inspection functions, and fixed it in commit 84ad68d64. Make
use of the same function for hash indexes.
A small difficulty is that up to now contrib/pageinspect has not shared
any functions at all across files. To support that, introduce a common
header file "pageinspect.h" for the module.
Also, move get_page_from_raw() out of ginfuncs.c, where it didn't
especially belong, and put it in rawpage.c which seems a more natural home.
Per buildfarm.
Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'contrib/pageinspect/hashfuncs.c')
-rw-r--r-- | contrib/pageinspect/hashfuncs.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index 83b469864a9..49cb12e5189 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -10,6 +10,8 @@ #include "postgres.h" +#include "pageinspect.h" + #include "access/hash.h" #include "access/htup_details.h" #include "catalog/pg_type.h" @@ -48,27 +50,15 @@ typedef struct HashPageStat /* * Verify that the given bytea contains a HASH page, or die in the attempt. - * A pointer to the page is returned. + * A pointer to a palloc'd, properly aligned copy of the page is returned. */ static Page verify_hash_page(bytea *raw_page, int flags) { - Page page; - int raw_page_size; + Page page = get_page_from_raw(raw_page); int pagetype; HashPageOpaque pageopaque; - raw_page_size = VARSIZE(raw_page) - VARHDRSZ; - - if (raw_page_size != BLCKSZ) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid page size"), - errdetail("Expected size %d, got %d", - BLCKSZ, raw_page_size))); - - page = VARDATA(raw_page); - if (PageIsNew(page)) ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), |