]> granicus.if.org Git - postgresql/commitdiff
Make walsender always initialize the buffers.
authorFujii Masao <fujii@postgresql.org>
Tue, 21 Feb 2017 18:11:58 +0000 (03:11 +0900)
committerFujii Masao <fujii@postgresql.org>
Tue, 21 Feb 2017 23:29:32 +0000 (08:29 +0900)
Walsender uses the local buffers for each outgoing and incoming message.
Previously when creating replication slot, walsender forgot to initialize
one of them and which can cause the segmentation fault error. To fix this
issue, this commit changes walsender so that it always initialize them
before it executes the requested replication command.

Back-patch to 9.4 where replication slot was introduced.

Problem report and initial patch by Stas Kelvich, modified by me.
Report: https://www.postgresql.org/message-id/A1E9CB90-1FAC-4CAD-8DBA-9AA62A6E97C5@postgrespro.ru

src/backend/replication/walsender.c

index 1ea2a5cfdf1225d1ab781a227a713c8f96ad6f62..b2c059e6b0bea8bb5e67eb1a990a4d070fba61f9 100644 (file)
@@ -808,8 +808,6 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
                ReplicationSlotCreate(cmd->slotname, true, RS_EPHEMERAL);
        }
 
-       initStringInfo(&output_message);
-
        if (cmd->kind == REPLICATION_KIND_LOGICAL)
        {
                LogicalDecodingContext *ctx;
@@ -1322,6 +1320,14 @@ exec_replication_command(const char *cmd_string)
 
        cmd_node = replication_parse_result;
 
+       /*
+        * Allocate buffers that will be used for each outgoing and incoming
+        * message.  We do this just once per command to reduce palloc overhead.
+        */
+       initStringInfo(&output_message);
+       initStringInfo(&reply_message);
+       initStringInfo(&tmpbuf);
+
        switch (cmd_node->type)
        {
                case T_IdentifySystemCmd:
@@ -1791,14 +1797,6 @@ WalSndCheckTimeOut(TimestampTz now)
 static void
 WalSndLoop(WalSndSendDataCallback send_data)
 {
-       /*
-        * Allocate buffers that will be used for each outgoing and incoming
-        * message.  We do this just once to reduce palloc overhead.
-        */
-       initStringInfo(&output_message);
-       initStringInfo(&reply_message);
-       initStringInfo(&tmpbuf);
-
        /*
         * Initialize the last reply timestamp. That enables timeout processing
         * from hereon.