Avoid possible crash in contrib/bloom's blendscan().
authorTom Lane
Tue, 17 May 2016 21:01:18 +0000 (17:01 -0400)
committerTom Lane
Tue, 17 May 2016 21:01:18 +0000 (17:01 -0400)
It's possible to begin and end an indexscan without ever calling
amrescan.  contrib/bloom, unlike every other index AM, allocated
its "scan->opaque" storage at amrescan time, and thus would crash
in amendscan if amrescan hadn't been called.  We could fix this
by putting in a null-pointer check in blendscan, but I see no very
good reason why contrib/bloom should march to its own drummer in
this respect.  Let's move that initialization to blbeginscan
instead.  Per report from Jeff Janes.

contrib/bloom/blscan.c

index fc82f543738952033fc8b26cdb7a17914e6e3587..aebf32a8d2fcf732fd0b39efa719b97e56f6b33d 100644 (file)
@@ -29,9 +29,16 @@ IndexScanDesc
 blbeginscan(Relation r, int nkeys, int norderbys)
 {
    IndexScanDesc scan;
+   BloomScanOpaque so;
 
    scan = RelationGetIndexScan(r, nkeys, norderbys);
 
+   so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
+   initBloomState(&so->state, scan->indexRelation);
+   so->sign = NULL;
+
+   scan->opaque = so;
+
    return scan;
 }
 
@@ -42,23 +49,10 @@ void
 blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
         ScanKey orderbys, int norderbys)
 {
-   BloomScanOpaque so;
-
-   so = (BloomScanOpaque) scan->opaque;
-
-   if (so == NULL)
-   {
-       /* if called from blbeginscan */
-       so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
-       initBloomState(&so->state, scan->indexRelation);
-       scan->opaque = so;
+   BloomScanOpaque so = (BloomScanOpaque) scan->opaque;
 
-   }
-   else
-   {
-       if (so->sign)
-           pfree(so->sign);
-   }
+   if (so->sign)
+       pfree(so->sign);
    so->sign = NULL;
 
    if (scankey && scan->numberOfKeys > 0)