From edd5d0719c3095a1dbbcefc0ef4c8b2b37d4a2d8 Mon Sep 17 00:00:00 2001 From: Jacob Champion Date: Fri, 21 Nov 2025 09:18:40 -0800 Subject: [PATCH v4 5/5] pqcomm.h: Explicitly reserve protocol v3.1 Document this alongside the other special protocol numbers. --- src/include/libpq/pqcomm.h | 6 ++++++ src/interfaces/libpq/fe-protocol3.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index 0fe7d8e897d..31577e1cf98 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -98,6 +98,12 @@ is_unixsock_path(const char *path) * Reserved protocol numbers, which have special semantics: */ +/* + * 3.1 would have collided with old pgbouncer deployments, and was skipped. We + * neither emit it nor accept it on the wire. + */ +#define PG_PROTOCOL_RSRV31 PG_PROTOCOL(3,1) + /* * PG_PROTOCOL_GREASE is an intentionally unsupported protocol version used * for GREASE (Generate Random Extensions And Sustain Extensibility). This diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 7457ba2498c..e32a7a33e32 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -1467,7 +1467,7 @@ pqGetNegotiateProtocolVersion3(PGconn *conn) } /* 3.1 never existed, we went straight from 3.0 to 3.2 */ - if (their_version == PG_PROTOCOL(3, 1)) + if (their_version == PG_PROTOCOL_RSRV31) { libpq_append_conn_error(conn, "received invalid protocol negotiation message: server requested downgrade to non-existent 3.1 protocol version"); goto failure; -- 2.34.1