]> granicus.if.org Git - postgresql/commitdiff
Fix corruption of 2PC recovery with subxacts
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 9 Sep 2016 12:11:25 +0000 (13:11 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 9 Sep 2016 12:11:25 +0000 (13:11 +0100)
Reading 2PC state files during recovery was borked, causing corruptions during
recovery. Effect limited to servers with 2PC, subtransactions and
recovery/replication.

Stas Kelvich, reviewed by Michael Paquier and Pavan Deolasee

src/backend/access/transam/twophase.c

index 1323fb508dc9585e8366dcc8f24ed8fe88fcee46..5415604993a75170444bdf0a4e931e8c1edffb49 100644 (file)
@@ -1758,8 +1758,9 @@ PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p)
                         * need to hold a lock while examining it.  We still acquire the
                         * lock to modify it, though.
                         */
-                       subxids = (TransactionId *)
-                               (buf + MAXALIGN(sizeof(TwoPhaseFileHeader)));
+                       subxids = (TransactionId *) (buf +
+                                                               MAXALIGN(sizeof(TwoPhaseFileHeader)) +
+                                                               MAXALIGN(hdr->gidlen));
                        for (i = 0; i < hdr->nsubxacts; i++)
                        {
                                TransactionId subxid = subxids[i];
@@ -1877,8 +1878,9 @@ StandbyRecoverPreparedTransactions(bool overwriteOK)
                         * Examine subtransaction XIDs ... they should all follow main
                         * XID.
                         */
-                       subxids = (TransactionId *)
-                               (buf + MAXALIGN(sizeof(TwoPhaseFileHeader)));
+                       subxids = (TransactionId *) (buf +
+                                                               MAXALIGN(sizeof(TwoPhaseFileHeader)) +
+                                                               MAXALIGN(hdr->gidlen));
                        for (i = 0; i < hdr->nsubxacts; i++)
                        {
                                TransactionId subxid = subxids[i];