aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2023-01-21 06:08:00 -0800
committerNoah Misch <noah@leadboat.com>2023-01-21 06:08:03 -0800
commitb152bb7b2724a7c62c2440c510af4926a996bbbc (patch)
tree255c071b127f8490a4a4e203df0cdf08c267a334
parent9a40a031197a302a638d6464c9db081b7839175f (diff)
downloadpostgresql-b152bb7b2724a7c62c2440c510af4926a996bbbc.tar.gz
postgresql-b152bb7b2724a7c62c2440c510af4926a996bbbc.zip
Reject CancelRequestPacket having unexpected length.
When the length was too short, the server read outside the allocation. That yielded the same log noise as sending the correct length with (backendPID,cancelAuthCode) matching nothing. Change to a message about the unexpected length. Given the attacker's lack of control over the memory layout and the general lack of diversity in memory layouts at the code in question, we doubt a would-be attacker could cause a segfault. Hence, while the report arrived via security@postgresql.org, this is not a vulnerability. Back-patch to v11 (all supported versions). Andrey Borodin, reviewed by Tom Lane. Reported by Andrey Borodin.
-rw-r--r--src/backend/postmaster/postmaster.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index d1e9ad2ec4a..0a33479efdd 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -2075,6 +2075,13 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done)
if (proto == CANCEL_REQUEST_CODE)
{
+ if (len != sizeof(CancelRequestPacket))
+ {
+ ereport(COMMERROR,
+ (errcode(ERRCODE_PROTOCOL_VIOLATION),
+ errmsg("invalid length of startup packet")));
+ return STATUS_ERROR;
+ }
processCancelRequest(port, buf);
/* Not really an error, but we don't want to proceed further */
return STATUS_ERROR;