Avoid possible crash in contrib/bloom's blendscan().

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.
This commit is contained in:
Tom Lane 2016-05-17 17:01:18 -04:00
parent 7c979c95a3
commit e13ac5586c
1 changed files with 10 additions and 16 deletions

View 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;
BloomScanOpaque so = (BloomScanOpaque) scan->opaque;
so = (BloomScanOpaque) scan->opaque;
if (so == NULL)
{
/* if called from blbeginscan */
so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
initBloomState(&so->state, scan->indexRelation);
scan->opaque = so;
}
else
{
if (so->sign)
pfree(so->sign);
}
if (so->sign)
pfree(so->sign);
so->sign = NULL;
if (scankey && scan->numberOfKeys > 0)