page.h.patch   [plain text]


*** /tmp/,RCSt1a21720	Wed Apr  3 11:49:55 1996
--- page.h	Wed Apr  3 08:42:25 1996
***************
*** 158,163
  
  #define PAIRFITS(P,K,D)	((PAIRSIZE((K),(D))) <= FREESPACE((P)))
  #define BIGPAIRFITS(P)	((FREESPACE((P)) >= PAIR_OVERHEAD))
  #define FREESPACE(P) \
  	((OFFSET((P)) - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
  

--- 158,169 -----
  
  #define PAIRFITS(P,K,D)	((PAIRSIZE((K),(D))) <= FREESPACE((P)))
  #define BIGPAIRFITS(P)	((FREESPACE((P)) >= PAIR_OVERHEAD))
+ /*
+  * Since these are all unsigned, we need to guarantee that we never go
+  * negative.  Offset values are 0-based and overheads are one based (i.e.
+  * one byte of overhead is 1, not 0), so we need to convert OFFSETs to
+  * 1-based counting before subtraction.
+  */
  #define FREESPACE(P) \
  	((OFFSET((P)) + 1 - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
  
***************
*** 159,165
  #define PAIRFITS(P,K,D)	((PAIRSIZE((K),(D))) <= FREESPACE((P)))
  #define BIGPAIRFITS(P)	((FREESPACE((P)) >= PAIR_OVERHEAD))
  #define FREESPACE(P) \
! 	((OFFSET((P)) - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
  
  /* 
   * Overhead on header pages is just one word -- the length of the

--- 165,171 -----
   * 1-based counting before subtraction.
   */
  #define FREESPACE(P) \
! 	((OFFSET((P)) + 1 - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
  
  /* 
   * Overhead on header pages is just one word -- the length of the