v1-0001-Refuse-to-register-message-in-LogLogicalMessage-i.patch
text/x-patch
Filename: v1-0001-Refuse-to-register-message-in-LogLogicalMessage-i.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Refuse to register message in LogLogicalMessage if NULL
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 1 | 0 |
| src/backend/replication/logical/message.c | 2 | 1 |
From 331cec1c9db6ff60dcc6d9ba62a9c8be4e5e95ed Mon Sep 17 00:00:00 2001 From: Tristan Partin <tristan@neon.tech> Date: Mon, 29 Jan 2024 18:03:39 -0600 Subject: [PATCH v1 1/3] Refuse to register message in LogLogicalMessage if NULL If this occurs, the memcpy of rdata_data in CopyXLogRecordToWAL breaks the API contract of memcpy in glibc. The two pointer arguments are marked as nonnull, even in the event the amount to copy is 0 bytes. --- src/backend/access/transam/xlog.c | 1 + src/backend/replication/logical/message.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 478377c4a2..929888beb5 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1288,6 +1288,7 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, } Assert(CurrPos % XLOG_BLCKSZ >= SizeOfXLogShortPHD || rdata_len == 0); + Assert(rdata_data != NULL); memcpy(currpos, rdata_data, rdata_len); currpos += rdata_len; CurrPos += rdata_len; diff --git a/src/backend/replication/logical/message.c b/src/backend/replication/logical/message.c index 2ac34e7781..126c57ef6e 100644 --- a/src/backend/replication/logical/message.c +++ b/src/backend/replication/logical/message.c @@ -67,7 +67,8 @@ LogLogicalMessage(const char *prefix, const char *message, size_t size, XLogBeginInsert(); XLogRegisterData((char *) &xlrec, SizeOfLogicalMessage); XLogRegisterData(unconstify(char *, prefix), xlrec.prefix_size); - XLogRegisterData(unconstify(char *, message), size); + if (message) + XLogRegisterData(unconstify(char *, message), size); /* allow origin filtering */ XLogSetRecordFlags(XLOG_INCLUDE_ORIGIN); -- Tristan Partin Neon (https://neon.tech)