aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2023-07-20 14:23:46 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2023-07-20 14:23:46 -0400
commit291c0254025bb67ceedeaca8531f1b14b8aaeeff (patch)
treecf5fbb0a6842a0a3e24d6664b50f3b7f1d3edb4e
parent27e945944bdb55de0e5362a2a89848fec5cfb45f (diff)
downloadpostgresql-291c0254025bb67ceedeaca8531f1b14b8aaeeff.tar.gz
postgresql-291c0254025bb67ceedeaca8531f1b14b8aaeeff.zip
Guard against null plan pointer in CachedPlanIsSimplyValid().
If both the passed-in plan pointer and plansource->gplan are NULL, CachedPlanIsSimplyValid would think that the plan pointer is possibly-valid and try to dereference it. For the one extant call site in plpgsql, this situation doesn't normally happen which is why we've not noticed. However, it appears to be possible if the previous use of the cached plan failed, as per report from Justin Pryzby. Add an extra check to prevent crashing. Back-patch to v13 where this code was added. Discussion: https://postgr.es/m/ZLlV+STFz1l/WhAQ@telsasoft.com
-rw-r--r--src/backend/utils/cache/plancache.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c
index b481cac5566..73fb2011b48 100644
--- a/src/backend/utils/cache/plancache.c
+++ b/src/backend/utils/cache/plancache.c
@@ -1436,7 +1436,9 @@ CachedPlanIsSimplyValid(CachedPlanSource *plansource, CachedPlan *plan,
* that here we *do* check plansource->is_valid, so as to force plan
* rebuild if that's become false.
*/
- if (!plansource->is_valid || plan != plansource->gplan || !plan->is_valid)
+ if (!plansource->is_valid ||
+ plan == NULL || plan != plansource->gplan ||
+ !plan->is_valid)
return false;
Assert(plan->magic == CACHEDPLAN_MAGIC);