diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-06-05 17:42:50 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-06-05 17:42:50 +0000 |
commit | 1532e3a8aa3a9b4daa9d0fc4962f7768ede53b51 (patch) | |
tree | e433fec76788ebe36521be6e1b059756f1eaa6a1 /src | |
parent | a757fd70e56a2e6c147f9947b305f681150fca9f (diff) | |
download | postgresql-1532e3a8aa3a9b4daa9d0fc4962f7768ede53b51.tar.gz postgresql-1532e3a8aa3a9b4daa9d0fc4962f7768ede53b51.zip |
Adjust PageGetMaxOffsetNumber to ensure sane behavior on uninitialized
pages, even when the macro's result is stored into an unsigned variable.
Diffstat (limited to 'src')
-rw-r--r-- | src/include/storage/bufpage.h | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 930887b169e..348a3fcfd4c 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: bufpage.h,v 1.55 2003/08/04 02:40:14 momjian Exp $ + * $Id: bufpage.h,v 1.55.4.1 2004/06/05 17:42:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -283,13 +283,14 @@ typedef PageHeaderData *PageHeader; * Since offset numbers are 1-based, this is also the number * of items on the page. * - * NOTE: to ensure sane behavior if the page is not initialized - * (pd_lower == 0), cast the unsigned values to int before dividing. - * That way we get -1 or so, not a huge positive number... + * NOTE: if the page is not initialized (pd_lower == 0), we must + * return zero to ensure sane behavior. Accept double evaluation + * of the argument so that we can ensure this. */ #define PageGetMaxOffsetNumber(page) \ - (((int) (((PageHeader) (page))->pd_lower - SizeOfPageHeaderData)) \ - / ((int) sizeof(ItemIdData))) + (((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData ? 0 : \ + ((((PageHeader) (page))->pd_lower - SizeOfPageHeaderData) \ + / sizeof(ItemIdData))) #define PageGetLSN(page) \ (((PageHeader) (page))->pd_lsn) |