Fix portalmem.c to avoid keeping a dangling pointer to a cached plan list

after it's released its reference count for the cached plan.  There are
code paths that might try to examine the plan list before noticing that
the portal is already in aborted state.  Report and diagnosis by Tatsuo
Ishii, though this isn't exactly his proposed patch.
REL8_4_STABLE
Tom Lane 16 years ago
parent 69273fb018
commit 524d357d09
  1. 13
      src/backend/utils/mmgr/portalmem.c

@ -12,7 +12,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.113.2.1 2009/12/29 17:41:09 heikki Exp $
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.113.2.2 2010/01/18 02:30:30 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -328,6 +328,13 @@ PortalReleaseCachedPlan(Portal portal)
{
ReleaseCachedPlan(portal->cplan, false);
portal->cplan = NULL;
/*
* We must also clear portal->stmts which is now a dangling
* reference to the cached plan's plan list. This protects any
* code that might try to examine the Portal later.
*/
portal->stmts = NIL;
}
}
@ -395,7 +402,6 @@ PortalDrop(Portal portal, bool isTopCommit)
(*portal->cleanup) (portal);
/* drop cached plan reference, if any */
if (portal->cplan)
PortalReleaseCachedPlan(portal);
/*
@ -529,7 +535,6 @@ CommitHoldablePortals(void)
PersistHoldablePortal(portal);
/* drop cached plan reference, if any */
if (portal->cplan)
PortalReleaseCachedPlan(portal);
/*
@ -680,7 +685,6 @@ AtAbort_Portals(void)
}
/* drop cached plan reference, if any */
if (portal->cplan)
PortalReleaseCachedPlan(portal);
/*
@ -823,7 +827,6 @@ AtSubAbort_Portals(SubTransactionId mySubid,
}
/* drop cached plan reference, if any */
if (portal->cplan)
PortalReleaseCachedPlan(portal);
/*

Loading…
Cancel
Save