From 80afb62db0f118f70367a357cef0509a11112ebb Mon Sep 17 00:00:00 2001
From: Teodor Sigaev <teodor@sigaev.ru>
Date: Sat, 2 Apr 2016 13:47:04 +0300
Subject: [PATCH] Fixes in bloom contrib module

Looking at result of buildfarm member jaguarundi it seems to me that
BloomOptions isn't inited sometime, but I don't see yet how it's possible.
Nevertheless, check of signature length's is missed, so, add
a limit of it. Also add missed GenericXLogAbort() in case of already
deleted page in vacuum + minor code refactoring.
---
 contrib/bloom/bloom.h    |  6 ++++++
 contrib/bloom/blutils.c  | 11 +++++++----
 contrib/bloom/blvacuum.c | 13 +++++++------
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h
index 63095723c9a..fb0bc07f284 100644
--- a/contrib/bloom/bloom.h
+++ b/contrib/bloom/bloom.h
@@ -63,6 +63,12 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
 #define BLOOM_METAPAGE_BLKNO	(0)
 #define BLOOM_HEAD_BLKNO		(1)		/* first data page */
 
+/*
+ * Maximum of bloom signature length in uint16. Actual value
+ * is 512 bytes
+ */
+#define MAX_BLOOM_LENGTH		(256)
+
 /* Bloom index options */
 typedef struct BloomOptions
 {
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index b86f51fb825..f301f415ab2 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -177,7 +177,7 @@ myRand()
 	/*
 	 * Compute x = (7^5 * x) mod (2^31 - 1)
 	 * without overflowing 31 bits:
-	 *      (2^31 - 1) = 127773 * (7^5) + 2836
+	 *		(2^31 - 1) = 127773 * (7^5) + 2836
 	 * From "Random number generators: good ones are hard to find",
 	 * Park and Miller, Communications of the ACM, vol. 31, no. 10,
 	 * October 1988, p. 1195.
@@ -370,8 +370,11 @@ adjustBloomOptions(BloomOptions *opts)
 	/* Default length of bloom filter is 5 of 16-bit integers */
 	if (opts->bloomLength <= 0)
 		opts->bloomLength = 5;
-	else
-		opts->bloomLength = opts->bloomLength;
+	else if (opts->bloomLength > MAX_BLOOM_LENGTH)
+		ereport(ERROR,
+				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+				 errmsg("length of bloom signature (%d) is greater than maximum %d",
+						opts->bloomLength, MAX_BLOOM_LENGTH)));
 
 	/* Check singnature length */
 	for (i = 0; i < INDEX_MAX_KEYS; i++)
@@ -382,7 +385,7 @@ adjustBloomOptions(BloomOptions *opts)
 		 * with 2 bits default.
 		 */
 		if (opts->bitSize[i] <= 0
-			|| opts->bitSize[i] >= opts->bloomLength * sizeof(SignType))
+			|| opts->bitSize[i] >= opts->bloomLength * sizeof(SignType) * BITS_PER_BYTE)
 			opts->bitSize[i] = 2;
 	}
 }
diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c
index d976ce53305..9fee3c1294f 100644
--- a/contrib/bloom/blvacuum.c
+++ b/contrib/bloom/blvacuum.c
@@ -70,14 +70,15 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 		if (BloomPageIsDeleted(page))
 		{
 			UnlockReleaseBuffer(buffer);
+			GenericXLogAbort(gxlogState);
 			CHECK_FOR_INTERRUPTS();
 			continue;
 		}
 
 		/* Iterate over the tuples */
-		itup = BloomPageGetTuple(&state, page, 1);
-		itupPtr = BloomPageGetTuple(&state, page, 1);
-		itupEnd = BloomPageGetTuple(&state, page, BloomPageGetMaxOffset(page) + 1);
+		itup = itupPtr = BloomPageGetTuple(&state, page, FirstOffsetNumber);
+		itupEnd = BloomPageGetTuple(&state, page,
+								OffsetNumberNext(BloomPageGetMaxOffset(page)));
 		while (itup < itupEnd)
 		{
 			/* Do we have to delete this tuple? */
@@ -104,10 +105,10 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 			itup = BloomPageGetNextTuple(&state, itup);
 		}
 
-		Assert(itupPtr == BloomPageGetTuple(&state, page, BloomPageGetMaxOffset(page) + 1));
+		Assert(itupPtr == BloomPageGetTuple(&state, page,
+								OffsetNumberNext(BloomPageGetMaxOffset(page))));
 
-		if (!BloomPageIsDeleted(page) &&
-			BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple &&
+		if (BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple &&
 			countPage < BloomMetaBlockN)
 			notFullPage[countPage++] = blkno;
 
-- 
GitLab