postgres.git / summary / log / commit / refs

commit    579ee5df14dfcf5213e502bb096121d2249167c2
Author:   David Rowley <drowley@postgresql.org>
Date:     Mon Mar 20 00:28:47 2023 +0000
First released in: 16.0, 14.8, 15.3

    Fix memory leak in Memoize cache key evaluation
    
    When probing the Memoize cache to check if the current cache key values
    exist in the cache, we perform an evaluation of the expressions making up
    the cache key before probing the hash table for those values.  This
    operation could leak memory as it is possible that the cache key is an
    expression which requires allocation of memory, as was the case in bug
    17844.
    
    Here we fix this by correctly switching to the per tuple context before
    evaluating the cache expressions so that the memory is freed next time the
    per tuple context is reset.
    
    Bug: 17844
    Reported-by: Alexey Ermakov
    Discussion: https://postgr.es/m/17844-d2f6f9e75a622bed@postgresql.org
    Backpatch-through: 14, where Memoize was introduced


src/backend/executor/nodeMemoize.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index 74f7d21bc85..4f04269e262 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -289,11 +289,18 @@ prepare_probe_slot(MemoizeState *mstate, MemoizeKey *key) if (key == NULL) { + ExprContext *econtext = mstate->ss.ps.ps_ExprContext; + MemoryContext oldcontext; + + oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); + /* Set the probeslot's values based on the current parameter values */ for (int i = 0; i < numKeys; i++) pslot->tts_values[i] = ExecEvalExpr(mstate->param_exprs[i], - mstate->ss.ps.ps_ExprContext, + econtext, &pslot->tts_isnull[i]); + + MemoryContextSwitchTo(oldcontext); } else { [parent: e060cd59fabd]