summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2017-02-22 03:11:58 +0900
committerFujii Masao <fujii@postgresql.org>2017-02-22 08:29:32 +0900
commit9fab155c68a4e2164c39f61bc849ad669ad54f2c (patch)
treeeb51f5e501294eb1be2d56b5fa0b088be50b8844
parent62ed08422cba0c1bf4ad1e721c13cd6ac9ed29a0 (diff)
Make walsender always initialize the buffers.
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
-rw-r--r--src/backend/replication/walsender.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 1ea2a5cfdf1..b2c059e6b0b 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -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:
@@ -1792,14 +1798,6 @@ 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.
*/