aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-01-18 02:30:30 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2010-01-18 02:30:30 +0000
commit524d357d09cd42a1e88636f2bc6a66bc402ca0a1 (patch)
treefd2f462bdc7155cc6e132efc7fc6b58c022f7870 /src
parent69273fb01880f151931f8349dae038e266bfe57d (diff)
downloadpostgresql-524d357d09cd42a1e88636f2bc6a66bc402ca0a1.tar.gz
postgresql-524d357d09cd42a1e88636f2bc6a66bc402ca0a1.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/mmgr/portalmem.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
index a8ee35f08a7..501ffb1635c 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/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,8 +402,7 @@ PortalDrop(Portal portal, bool isTopCommit)
(*portal->cleanup) (portal);
/* drop cached plan reference, if any */
- if (portal->cplan)
- PortalReleaseCachedPlan(portal);
+ PortalReleaseCachedPlan(portal);
/*
* Release any resources still attached to the portal. There are several
@@ -529,8 +535,7 @@ CommitHoldablePortals(void)
PersistHoldablePortal(portal);
/* drop cached plan reference, if any */
- if (portal->cplan)
- PortalReleaseCachedPlan(portal);
+ PortalReleaseCachedPlan(portal);
/*
* Any resources belonging to the portal will be released in the
@@ -680,8 +685,7 @@ AtAbort_Portals(void)
}
/* drop cached plan reference, if any */
- if (portal->cplan)
- PortalReleaseCachedPlan(portal);
+ PortalReleaseCachedPlan(portal);
/*
* Any resources belonging to the portal will be released in the
@@ -823,8 +827,7 @@ AtSubAbort_Portals(SubTransactionId mySubid,
}
/* drop cached plan reference, if any */
- if (portal->cplan)
- PortalReleaseCachedPlan(portal);
+ PortalReleaseCachedPlan(portal);
/*
* Any resources belonging to the portal will be released in the