| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
|---|---|
| To: | David Rowley <dgrowleyml(at)gmail(dot)com> |
| Cc: | kuzmin(dot)db4(at)gmail(dot)com, pgsql-bugs(at)lists(dot)postgresql(dot)org |
| Subject: | Re: BUG #19438: segfault with temp_file_limit inside cursor |
| Date: | 2026-03-27 17:41:29 |
| Message-ID: | 1338824.1774633289@sss.pgh.pa.us |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-bugs |
I wrote:
> Somehow, we are not crashing on a
> double free with the new memory chunk header infrastructure.
In fact, we are not. AllocSetFree does not change the "hdrmask" field
of a freed chunk. So if we try to free it again, we end up right back
at AllocSetFree, and the outcome is there's no detected problem but
the corresponding freelist is now corrupt because the chunk got linked
into it twice. In this example that doesn't cause any visible
misbehavior, because we'll free the holdStore's context before doing
very much more with it (and AllocSetCheck won't notice this type of
corruption). Other cases could lead to very hard-to-diagnose problems
that manifest somewhere far removed from the actual bug.
In MEMORY_CONTEXT_CHECKING builds, we can cheaply detect double frees
by using the existing behavior that requested_size is set to
InvalidAllocSize during AllocSetFree. Another plausible idea is to
change a freed chunk's MemoryContextMethodID to something invalid,
which'd permit detection of double frees even in
non-MEMORY_CONTEXT_CHECKING builds.
I made draft patches showing how to do it both ways. (Both patches
pass check-world and are able to detect the bug in v17.) The
methodid-change way seems like the better alternative to me,
but it is more invasive and does add a cycle or two when freeing or
reusing a chunk.
The other mcxt modules need to be looked at too, but I thought
I'd try to get agreement on the solution approach before going
further.
regards, tom lane
| Attachment | Content-Type | Size |
|---|---|---|
| detect-double-free-with-requested_size.patch | text/x-diff | 671 bytes |
| detect-double-free-with-methodid.patch | text/x-diff | 4.0 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Xuneng Zhou | 2026-03-28 05:47:51 | Re: BUG #19439: pg_stat_xact_user_tables stat not currect during the transaction |
| Previous Message | Lukas Fittl | 2026-03-27 15:25:47 | Re: Memory leak in pg_stat_statements when qtext file contains invalid encoding |