Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5868913

Browse files
committed
Fix ancient memory leak in contrib/auto_explain.
The ExecutorEnd hook is invoked in a context that could be quitelong-lived, not the executor's own per-query context as I thinkwe were sort of assuming. Thus, any cruft generated while producingthe EXPLAIN output could accumulate over multiple queries. This canresult in spectacular leakage if log_nested_statements is on, andeven without that I'm surprised nobody complained before.To fix, just switch into the executor's context so that anything weallocate will be released when standard_ExecutorEnd frees the executorstate. We might as well nuke the code's retail pfree of the explainoutput string, too; that's laughably inadequate to the need.Japin Li, per report from Jeff Janes. This bug is old, soback-patch to all supported branches.Discussion:https://postgr.es/m/CAMkU=1wCVtbeRn0s9gt12KwQ7PLXovbpM8eg25SYocKW3BT4hg@mail.gmail.com
1 parentdae5af6 commit5868913

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

‎contrib/auto_explain/auto_explain.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,15 @@ explain_ExecutorEnd(QueryDesc *queryDesc)
371371
{
372372
if (queryDesc->totaltime&&auto_explain_enabled())
373373
{
374+
MemoryContextoldcxt;
374375
doublemsec;
375376

377+
/*
378+
* Make sure we operate in the per-query context, so any cruft will be
379+
* discarded later during ExecutorEnd.
380+
*/
381+
oldcxt=MemoryContextSwitchTo(queryDesc->estate->es_query_cxt);
382+
376383
/*
377384
* Make sure stats accumulation is done. (Note: it's okay if several
378385
* levels of hook all do this.)
@@ -424,9 +431,9 @@ explain_ExecutorEnd(QueryDesc *queryDesc)
424431
(errmsg("duration: %.3f ms plan:\n%s",
425432
msec,es->str->data),
426433
errhidestmt(true)));
427-
428-
pfree(es->str->data);
429434
}
435+
436+
MemoryContextSwitchTo(oldcxt);
430437
}
431438

432439
if (prev_ExecutorEnd)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp