Fix memory leakage when function compilation fails.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 May 2025 17:29:32 +0000 (13:29 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 May 2025 17:29:45 +0000 (13:29 -0400)
commitbe86ca103a41224e091a0d9aaf30605a935546ec
treeecb2c14941e4f15469c78e5f2b9644032c318d57
parentc861092b0e0fe2393bc5910843254714121f9e8f
Fix memory leakage when function compilation fails.

In pl_comp.c, initially create the plpgsql function's cache context
under the assumed-short-lived caller's context, and reparent it under
CacheMemoryContext only upon success.  This avoids a process-lifespan
leak of 8kB or more if the function contains syntax errors.  (This
leakage has existed for a long time without many complaints, but as
we move towards a possibly multi-threaded future, getting rid of
process-lifespan leaks grows more important.)

In funccache.c, arrange to reclaim the CachedFunction struct in case
the language-specific compile callback function throws an error;
previously, that resulted in an independent process-lifespan leak.
This is arguably a new bug in v18, since the leakage now occurred
for SQL-language functions as well as plpgsql.

Also, don't fill fn_xmin/fn_tid/dcallback until after successful
completion of the compile callback.  This avoids a scenario where a
partially-built function cache might appear already valid upon later
inspection, and another scenario where dcallback might fail upon being
presented with an incomplete cache entry.  We would have to reach such
a faulty cache entry via a pre-existing fn_extra pointer, so I'm not
sure these scenarios correspond to any live bug.  (The predecessor
code in pl_comp.c never took any care about this, and we've heard no
complaints about that.)  Still, it's better to be careful.

Given the lack of field complaints, I'm not very excited about
back-patching any of this; but it seems still in-scope for v18.

Discussion: https://postgr.es/m/999171.1748300004@sss.pgh.pa.us
src/backend/utils/cache/funccache.c
src/pl/plpgsql/src/pl_comp.c