Commit 24a1e20f authored by Tom Lane's avatar Tom Lane

Adjust PageGetMaxOffsetNumber to ensure sane behavior on uninitialized

pages, even when the macro's result is stored into an unsigned variable.
parent 641c5b56
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.57 2003/12/11 21:21:55 tgl Exp $ * $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.58 2004/06/05 17:42:46 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -283,13 +283,14 @@ typedef PageHeaderData *PageHeader; ...@@ -283,13 +283,14 @@ typedef PageHeaderData *PageHeader;
* Since offset numbers are 1-based, this is also the number * Since offset numbers are 1-based, this is also the number
* of items on the page. * of items on the page.
* *
* NOTE: to ensure sane behavior if the page is not initialized * NOTE: if the page is not initialized (pd_lower == 0), we must
* (pd_lower == 0), cast the unsigned values to int before dividing. * return zero to ensure sane behavior. Accept double evaluation
* That way we get -1 or so, not a huge positive number... * of the argument so that we can ensure this.
*/ */
#define PageGetMaxOffsetNumber(page) \ #define PageGetMaxOffsetNumber(page) \
(((int) (((PageHeader) (page))->pd_lower - SizeOfPageHeaderData)) \ (((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData ? 0 : \
/ ((int) sizeof(ItemIdData))) ((((PageHeader) (page))->pd_lower - SizeOfPageHeaderData) \
/ sizeof(ItemIdData)))
#define PageGetLSN(page) \ #define PageGetLSN(page) \
(((PageHeader) (page))->pd_lsn) (((PageHeader) (page))->pd_lsn)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment