diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2015-01-24 13:25:19 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2015-01-24 13:25:19 -0500 |
commit | f8a4dd2e141a12e349882edecc683504acb82ec8 (patch) | |
tree | 34bea4540b23f1169d8eb61ffb56b6a3f39da796 /src | |
parent | 586dd5d6a5d59e406bc8032bb52625ffb904311c (diff) | |
download | postgresql-f8a4dd2e141a12e349882edecc683504acb82ec8.tar.gz postgresql-f8a4dd2e141a12e349882edecc683504acb82ec8.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/logical/reorderbuffer.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 6e668aeef1e..82f83d14505 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"); |