]> granicus.if.org Git - postgresql/commitdiff
Avoid possible crash in contrib/bloom's blendscan().
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 17 May 2016 21:01:18 +0000 (17:01 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
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)