Re: BUG #16129: Segfault in tts_virtual_materialize in logical replication worker
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Tomas Vondra <tomas.vondra@2ndquadrant.com>
Cc: Ondřej Jirman <ienieghapheoghaiwida@xff.cz>, pgsql-bugs@lists.postgresql.org
Date: 2019-11-21T22:37:25Z
Lists: pgsql-bugs
Tomas Vondra <tomas.vondra@2ndquadrant.com> writes: > FWIW my hunch is the bug is somewhere in this chunk of code from > apply_heap_update: > oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate)); > ExecCopySlot(remoteslot, localslot); > slot_modify_cstrings(remoteslot, rel, newtup.values, newtup.changed); > MemoryContextSwitchTo(oldctx); My first reaction to looking at this was that ExecCopySlot() could be dropped entirely, because the first thing that slot_modify_cstrings does is slot_getallattrs(slot); ExecClearTuple(slot); That slot_getallattrs call seems 100% useless as well, because surely ExecClearTuple is just going to drop all the data. On closer inspection, though, it looks like the author of this code is relying on ExecClearTuple to *not* destroy the data, because the subsequent loop might overwrite only some of the slot's columns, before it does ExecStoreVirtualTuple(slot); which supposes that all the columns are valid. But of course this is 100% broken, because whatever ExecClearTuple may have done or not done to the slot's datum/isnull arrays, it certainly pfree'd the slot's physical tuple. So any pass-by-ref datums are now dangling pointers. I imagine the only reason this code has gotten past the valgrind animals is that we're not testing cases where non-replaced columns in the subscriber table are of pass-by-ref types. I draw a direct line between the existence of this bug and the lack of commentary in slot_modify_cstrings about what it's doing. If the author had troubled to write a comment explaining these machinations, he might've noticed the bug, or at least reviewers might have. regards, tom lane
Commits
-
Add test coverage for "unchanged toast column" replication code path.
- f67b173771a0 13.0 landed
- 8b46acf7c423 10.12 landed
- 8047a7b9dd45 12.2 landed
- 785206afdf1f 11.7 landed
-
Fix bogus tuple-slot management in logical replication UPDATE handling.
- b72a44c51ad6 11.7 landed
- a2aa224e05dc 12.2 landed
- 5d3fcb53a6a8 10.12 landed
- 4d9ceb0018cc 13.0 landed