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
commit9089287aa037fdecb5a52cec1926e5ae9569e9f9 (patch)
tree628f7fa2c8a841b9abc11b962ceb73b052c466bb
parent29a0ccbce97978e5d65b8f96c85a00611bb403c4 (diff)
downloadpostgresql-9089287aa037fdecb5a52cec1926e5ae9569e9f9.tar.gz
postgresql-9089287aa037fdecb5a52cec1926e5ae9569e9f9.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 3d3f7a9beae..56c84e1e629 100644
--- a/src/backend/utils/cache/plancache.c
+++ b/src/backend/utils/cache/plancache.c
@@ -1440,7 +1440,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);