Stefan Kaltenbrunner wrote:
> tried to test a bit on my Solaris 10 install(sun studio , 64bit build)
> but I'm hitting the following while trying to initdb a new cluster:

I can't reproduce this error, but I found a bug that's likely causing
it. The patch uses InvalidOffsetNumber in lp_off to mark so called
"redirect dead" line pointers, but that special case is not checked in
PageGetRedirectingOffset-function, writing to a caller-supplied array
with -1 index instead, globbering over whatever is there. Actually
storing InvalidOffsetNumber in lp_off is a bit bogus in the first place
since lp_off is unsigned, and InvalidOffsetNumber is -1, so I fixed that
as well.

Patch attached.

-- 
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com
*** src/backend/storage/page/bufpage.c	2007-07-14 20:54:04.000000000 +0100
--- src/backend/storage/page/bufpage.c	2007-07-14 20:37:36.000000000 +0100
***************
*** 1180,1186 ****
  			continue;
  
  		/* interested in only redirected lps */
! 		if (!ItemIdIsRedirected(lp))
  			continue;
  
  		offsets[ItemIdGetRedirect(lp) - 1] = offnum;
--- 1180,1186 ----
  			continue;
  
  		/* interested in only redirected lps */
! 		if (!ItemIdIsRedirected(lp) || ItemIdIsRedirectDead(lp))
  			continue;
  
  		offsets[ItemIdGetRedirect(lp) - 1] = offnum;
*** src/include/storage/itemid.h	2007-07-14 20:54:04.000000000 +0100
--- src/include/storage/itemid.h	2007-07-14 20:46:09.000000000 +0100
***************
*** 27,32 ****
--- 27,37 ----
  typedef ItemIdData *ItemId;
  
  /*
+  * Magic lp_off value to mark "redirect dead" line pointers 
+  */
+ #define DeadOffsetNumber		0x7FFF
+ 
+ /*
   * lp_flags contains these flags:
   */
  #define LP_USED			0x01	/* this line pointer is being used */
***************
*** 127,140 ****
  ( \
  	AssertMacro(ItemIdIsValid(itemId)), \
  	(bool) ((ItemIdIsRedirected(itemId)) && \
! 			(ItemIdGetRedirect(itemId) == InvalidOffsetNumber)) \
  )
  
  /* Set itemId to redirect-dead i.e. redirected to itself */
  #define ItemIdSetRedirectDead(itemId) \
  ( \
  	AssertMacro(ItemIdIsValid(itemId)), \
! 	ItemIdSetRedirect((itemId), InvalidOffsetNumber) \
  )
  
  #endif   /* ITEMID_H */
--- 132,145 ----
  ( \
  	AssertMacro(ItemIdIsValid(itemId)), \
  	(bool) ((ItemIdIsRedirected(itemId)) && \
! 			(ItemIdGetRedirect(itemId) == DeadOffsetNumber)) \
  )
  
  /* Set itemId to redirect-dead i.e. redirected to itself */
  #define ItemIdSetRedirectDead(itemId) \
  ( \
  	AssertMacro(ItemIdIsValid(itemId)), \
! 	ItemIdSetRedirect((itemId), DeadOffsetNumber) \
  )
  
  #endif   /* ITEMID_H */
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to