[PATCH] Add reentrancy guards in ri_triggers.c

From: Lucas Jeffrey <lucas(dot)jeffrey(at)anachronics(dot)com>
To: pgsql-hackers(at)lists(dot)postgresql(dot)org
Cc: Rodolfo Campero <rodolfo(dot)campero(at)anachronics(dot)com>, Marcos Castedo <marcos(dot)castedo(at)anachronics(dot)com>, Andrés Krüger <andres(dot)kruger(at)anachronics(dot)com>
Subject: [PATCH] Add reentrancy guards in ri_triggers.c
Date: 2026-05-20 13:14:36
Message-ID: CAGHzy7RCXRo6iz1kL-p6g1r9x=EL-Yb7jPgLj4n5YEtYsugzJg@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi hackers,

We found a bug where executing a DELETE on a self-referential table that
fires triggers can cause a segmentation fault. This is due to a
*use-after-free* of a Postgres plan generated by the referential integrity
module (ri_triggers.c, RI_FKey_cascade_del). The crash occurs if the
Postgres plancache is invalidated (ResetPlanCache) during the execution of
a reentrant RI trigger.

A reentrant RI_FKey_cascade_del can occur if a table is self-referential
(i.e., it has a foreign key referencing its own primary key) and has BEFORE
DELETE triggers that delete rows from that same table.

-

*The first patch* adds a test case that reproduces the segmentation
fault. The crash itself happens in _SPI_execute_plan, but the root cause
is that the plan being executed was prematurely freed by the RI module.
-

*The second patch* fixes ri_triggers.c by introducing reentrancy guards,
which maintain a reference count of plans in execution to prevent them from
being freed while active.

Feedback and reviews are welcome.

Best regards,

Lucas Jeffrey

Attachment Content-Type Size
0002-Fix-crash-in-RI-triggers-by-refcounting-active-plans.patch text/x-patch 4.8 KB
0001-Add-isolation-test-case-for-RI-plan-invalidation-cra.patch text/x-patch 5.1 KB

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii Masao 2026-05-20 16:26:53 Re: Deadlock detector fails to activate on a hot standby replica
Previous Message Alexander Korotkov 2026-05-20 12:16:45 Re: Implement waiting for wal lsn replay: reloaded