pgsql: Fix use-after-free of qs in AfterTriggerEndQuery. - Mailing list pgsql-committers

From Amit Langote
Subject pgsql: Fix use-after-free of qs in AfterTriggerEndQuery.
Date
Msg-id E1wL9K8-000mhu-0N@gemulon.postgresql.org
Whole thread
List pgsql-committers
Fix use-after-free of qs in AfterTriggerEndQuery.

afterTriggerInvokeEvents() may repalloc afterTriggers.query_stack
while firing trigger events, leaving any precomputed entry pointer
dangling.  The loop body in AfterTriggerEndQuery() recomputes qs
after each afterTriggerInvokeEvents() call for that reason, but the
"all fired" break path exits without the recompute, and the
subsequent FireAfterTriggerBatchCallbacks(qs->batch_callbacks)
dereferences the freed pointer.

Fix by recomputing qs immediately before
FireAfterTriggerBatchCallbacks(), as the loop body already does
after each afterTriggerInvokeEvents() call.

The hazard was introduced in 34a30786293, which added the
qs->batch_callbacks dereference at this site.

Reported-by: Amul Sul <sulamul@gmail.com>
Author: Amul Sul <sulamul@gmail.com>
Reviewed-by: Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com>
Reviewed-by: Amit Langote <amitlangote09@gmail.com>
Discussion: https://postgr.es/m/CAAJ_b95p6-qiVpE2Gpr=bUsNAqTcejD_rPgLnfjx9m=fo3Rf3Q@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/4b1b2be22f2588f00dfd330886c1ca949f7dd938

Modified Files
--------------
src/backend/commands/trigger.c         |  5 +++++
src/test/regress/expected/triggers.out | 24 ++++++++++++++++++++++++
src/test/regress/sql/triggers.sql      | 23 +++++++++++++++++++++++
3 files changed, 52 insertions(+)


pgsql-committers by date:

Previous
From: Bruce Momjian
Date:
Subject: pgsql: doc PG 19 relnotes: correct two items
Next
From: Bruce Momjian
Date:
Subject: pgsql: doc PG 19 relnotes: add UTF-8 case folding performance item