From f8a4dd2e141a12e349882edecc683504acb82ec8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 24 Jan 2015 13:25:19 -0500 Subject: [PATCH] Fix unsafe coding in ReorderBufferCommit(). "iterstate" must be marked volatile since it's changed inside the PG_TRY block and then used in the PG_CATCH stanza. Noted by Mark Wilding of Salesforce. (We really need to see if we can't get the C compiler to warn about this.) Also, reset iterstate to NULL after the mainline ReorderBufferIterTXNFinish call, to ensure the PG_CATCH block doesn't try to do that a second time. --- src/backend/replication/logical/reorderbuffer.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 6e668aeef1..82f83d1450 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -1258,7 +1258,7 @@ ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid, TimestampTz commit_time) { ReorderBufferTXN *txn; - ReorderBufferIterTXNState *iterstate = NULL; + ReorderBufferIterTXNState *volatile iterstate = NULL; ReorderBufferChange *change; volatile CommandId command_id = FirstCommandId; @@ -1303,7 +1303,6 @@ ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid, PG_TRY(); { - /* * Decoding needs access to syscaches et al., which in turn use * heavyweight locks and such. Thus we need to have enough state @@ -1472,7 +1471,9 @@ ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid, } } + /* clean up the iterator */ ReorderBufferIterTXNFinish(rb, iterstate); + iterstate = NULL; /* call commit callback */ rb->commit(rb, txn, commit_lsn); @@ -1639,7 +1640,7 @@ ReorderBufferForget(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn) */ if (txn->base_snapshot != NULL && txn->ninvalidations > 0) { - bool use_subtxn = IsTransactionOrTransactionBlock(); + bool use_subtxn = IsTransactionOrTransactionBlock(); if (use_subtxn) BeginInternalSubTransaction("replay"); -- 2.40.0