pgsql: Fix possible crash during FATAL exit from reindexing. - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Fix possible crash during FATAL exit from reindexing.
Date
Msg-id E1jQz3D-0000WB-S2@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix possible crash during FATAL exit from reindexing.

index.c supposed that it could just use a PG_TRY block to clean up the
state associated with an active REINDEX operation.  However, that code
doesn't run if we do a FATAL exit --- for example, due to a SIGTERM
shutdown signal --- while the REINDEX is happening.  And that state does
get consulted during catalog accesses, which makes it problematic if we
do any catalog accesses during shutdown --- for example, to clean up any
temp tables created in the session.

If this combination of circumstances occurred, we could find ourselves
trying to access already-freed memory.  In debug builds that'd fairly
reliably cause an assertion failure.  In production we might often
get away with it, but with some bad luck it could cause a core dump.

Another possible bad outcome is an erroneous conclusion that an
index-to-be-accessed is being reindexed; but it looks like that would
be unlikely to have any consequences worse than failing to drop temp
tables right away.  (They'd still get dropped by the next session that
uses that temp schema.)

To fix, get rid of the use of PG_TRY here, and instead hook into
the transaction abort mechanisms to clean up reindex state.

Per bug #16378 from Alexander Lakhin.  This has been wrong for a
very long time, so back-patch to all supported branches.

Discussion: https://postgr.es/m/16378-7a70ca41b3ec2009@postgresql.org

Branch
------
REL_12_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/5a4efd100ad48d7fd876ce1bc283ad56560039e0

Modified Files
--------------
src/backend/access/transam/xact.c |   7 ++
src/backend/catalog/index.c       | 186 +++++++++++++++++++-------------------
src/include/catalog/index.h       |   4 +-
3 files changed, 103 insertions(+), 94 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Fix minor violations of FunctionCallInvoke usage protocol.
Next
From: Alvaro Herrera
Date:
Subject: pgsql: Document partitiong tables ancillary object handling some more