On Mon, Oct 21, 2024 at 10:00:00PM +0300, Alexander Lakhin wrote: > Please look at an anomaly introduced with a07e03fd8. > With the attached modification for intra-grant-inplace.spec, running this > test triggers a Valgrind-detected error for me: > ==00:00:00:09.624 319033== Conditional jump or move depends on uninitialised > value(s) > ==00:00:00:09.624 319033== at 0x25D120: DoesMultiXactIdConflict > (heapam.c:7373) > ==00:00:00:09.624 319033== by 0x25B45A: heap_inplace_lock (heapam.c:6265) > ==00:00:00:09.624 319033== by 0x27D8CB: systable_inplace_update_begin > (genam.c:867) > ==00:00:00:09.624 319033== by 0x33F717: index_update_stats (index.c:2856) > ==00:00:00:09.624 319033== by 0x33FEE2: index_build (index.c:3106) > ==00:00:00:09.625 319033== by 0x33C7D3: index_create (index.c:1276) > ==00:00:00:09.625 319033== by 0x451000: DefineIndex (indexcmds.c:1216) > ==00:00:00:09.625 319033== by 0x48D091: ATExecAddIndex (tablecmds.c:9156) > ==00:00:00:09.625 319033== by 0x483F8E: ATExecCmd (tablecmds.c:5302) > ==00:00:00:09.625 319033== by 0x483877: ATRewriteCatalogs > (tablecmds.c:5186) > ==00:00:00:09.625 319033== by 0x482B9A: ATController (tablecmds.c:4741) > ==00:00:00:09.625 319033== by 0x4827A1: AlterTable (tablecmds.c:4387) > ==00:00:00:09.625 319033==
Thanks. > Perhaps current_is_member in heap_inplace_lock() should be initialized > before the DoesMultiXactIdConflict() call as in other places... heap_inplace_lock() ignores current_is_member after computing it, so let's just pass NULL, as attached.
Author: Noah Misch <n...@leadboat.com> Commit: Noah Misch <n...@leadboat.com> Stop reading uninitialized memory in heap_inplace_lock(). Stop computing a never-used value. This removes the read; the read had no functional implications. Back-patch to v12, like commit a07e03fd8fa7daf4d1356f7cb501ffe784ea6257. Reported by Alexander Lakhin. Reviewed by FIXME. Discussion: https://postgr.es/m/6c92f59b-f5bc-e58c-9bdd-d1f21c17c...@gmail.com diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index da5e656..82a0492 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6260,10 +6260,9 @@ heap_inplace_lock(Relation relation, LockTupleMode lockmode = LockTupleNoKeyExclusive; MultiXactStatus mxact_status = MultiXactStatusNoKeyUpdate; int remain; - bool current_is_member; if (DoesMultiXactIdConflict((MultiXactId) xwait, infomask, - lockmode, ¤t_is_member)) + lockmode, NULL)) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); ret = false; diff --git a/src/test/isolation/expected/intra-grant-inplace.out b/src/test/isolation/expected/intra-grant-inplace.out index b5fe8b0..4e9695a 100644 --- a/src/test/isolation/expected/intra-grant-inplace.out +++ b/src/test/isolation/expected/intra-grant-inplace.out @@ -63,6 +63,30 @@ step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); <waiting ...> step r3: ROLLBACK; step addk2: <... completed> +starting permutation: b3 sfnku3 keyshr5 addk2 r3 +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfnku3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step keyshr5: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); <waiting ...> +step r3: ROLLBACK; +step addk2: <... completed> + starting permutation: b2 sfnku2 addk2 c2 step b2: BEGIN; step sfnku2: diff --git a/src/test/isolation/specs/intra-grant-inplace.spec b/src/test/isolation/specs/intra-grant-inplace.spec index 2992c85..9936d38 100644 --- a/src/test/isolation/specs/intra-grant-inplace.spec +++ b/src/test/isolation/specs/intra-grant-inplace.spec @@ -96,6 +96,14 @@ permutation addk2(r3) r3 +# reproduce bug in DoesMultiXactIdConflict() call +permutation + b3 + sfnku3 + keyshr5 + addk2(r3) + r3 + # same-xact rowmark permutation b2