Fix crash bug in RestoreSnapshot.
authorRobert Haas
Fri, 1 Jul 2016 12:51:58 +0000 (08:51 -0400)
committerRobert Haas
Fri, 1 Jul 2016 13:03:52 +0000 (09:03 -0400)
If serialized_snapshot->subxcnt > 0 and serialized_snapshot->xcnt == 0,
the old coding would do the wrong thing and crash.  This can happen
on standby servers.

Report by Andreas Seltenreich.  Patch by Thomas Munro, reviewed by
Amit Kapila and tested by Andreas Seltenreich.

src/backend/utils/time/snapmgr.c

index 6ef2df8a20a20429c5bb246ceedd86091bababd6..9cbe226b228709afcfe969d47551b00528e199ea 100644 (file)
@@ -1573,7 +1573,8 @@ RestoreSnapshot(char *start_address)
    /* Copy SubXIDs, if present. */
    if (serialized_snapshot->subxcnt > 0)
    {
-       snapshot->subxip = snapshot->xip + serialized_snapshot->xcnt;
+       snapshot->subxip = ((TransactionId *) (snapshot + 1)) +
+           serialized_snapshot->xcnt;
        memcpy(snapshot->subxip, serialized_xids + serialized_snapshot->xcnt,
               serialized_snapshot->subxcnt * sizeof(TransactionId));
    }