postgres.git / summary / log / commit / refs

commit    f8a4dd2e141a12e349882edecc683504acb82ec8
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sat Jan 24 18:25:19 2015 +0000

    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 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"); [parent: 586dd5d6a5d5]