From 38a2b95c342c0d3d261d525a74943a977725483e Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Mon, 7 Apr 2014 19:48:03 +0300
Subject: [PATCH] Zero padding byte at end of GIN posting list.

This isn't strictly necessary, but helps debugging.
---
 src/backend/access/gin/ginpostinglist.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/backend/access/gin/ginpostinglist.c b/src/backend/access/gin/ginpostinglist.c
index 9d68a980722..81bbb09c244 100644
--- a/src/backend/access/gin/ginpostinglist.c
+++ b/src/backend/access/gin/ginpostinglist.c
@@ -176,6 +176,9 @@ decode_varbyte(unsigned char **ptr)
  * 'maxsize' bytes in size.  The number items in the returned segment is
  * returned in *nwritten. If it's not equal to nipd, not all the items fit
  * in 'maxsize', and only the first *nwritten were encoded.
+ *
+ * The allocated size of the returned struct is short-aligned, and the padding
+ * byte at the end, if any, is zero.
  */
 GinPostingList *
 ginCompressPostingList(const ItemPointer ipd, int nipd, int maxsize,
@@ -188,9 +191,12 @@ ginCompressPostingList(const ItemPointer ipd, int nipd, int maxsize,
 	unsigned char *ptr;
 	unsigned char *endptr;
 
+	maxsize = SHORTALIGN_DOWN(maxsize);
+
 	result = palloc(maxsize);
 
 	maxbytes = maxsize - offsetof(GinPostingList, bytes);
+	Assert(maxbytes > 0);
 
 	/* Store the first special item */
 	result->first = ipd[0];
@@ -228,6 +234,13 @@ ginCompressPostingList(const ItemPointer ipd, int nipd, int maxsize,
 	}
 	result->nbytes = ptr - result->bytes;
 
+	/*
+	 * If we wrote an odd number of bytes, zero out the padding byte at the
+	 * end.
+	 */
+	if (result->nbytes != SHORTALIGN(result->nbytes))
+		result->bytes[result->nbytes] = 0;
+
 	if (nwritten)
 		*nwritten = totalpacked;
 
-- 
GitLab