summaryrefslogtreecommitdiff
path: root/src/backend/libpq/auth-sasl.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2021-07-10 21:45:28 +0900
committerMichael Paquier <michael@paquier.xyz>2021-07-10 21:45:28 +0900
commit44bd0126c70b5b90e8e2d604833a6476abbbffe6 (patch)
tree9103928081b8308011c119c6c5b92f22eb9c2dce /src/backend/libpq/auth-sasl.c
parente7fc488ad67caaad33f6d5177081884495cb81cb (diff)
Add more sanity checks in SASL exchanges
The following checks are added, to make the SASL infrastructure more aware of defects when implementing new mechanisms: - Detect that no output is generated by a mechanism if an exchange fails in the backend, failing if there is a message waiting to be sent. - Handle zero-length messages in the frontend. The backend handles that already, and SCRAM would complain if sending empty messages as this is not authorized for this mechanism, but other mechanisms may want this capability (the SASL specification allows that). - Make sure that a mechanism generates a message in the middle of the exchange in the frontend. SCRAM, as implemented, respects all these requirements already, and the recent refactoring of SASL done in 9fd8557 helps in documenting that in a cleaner way. Analyzed-by: Jacob Champion Author: Michael Paquier Reviewed-by: Jacob Champion Discussion: https://postgr.es/m/3d2a6f5d50e741117d6baf83eb67ebf1a8a35a11.camel@vmware.com
Diffstat (limited to 'src/backend/libpq/auth-sasl.c')
-rw-r--r--src/backend/libpq/auth-sasl.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/libpq/auth-sasl.c b/src/backend/libpq/auth-sasl.c
index 3e4f763b609..6cfd90fa214 100644
--- a/src/backend/libpq/auth-sasl.c
+++ b/src/backend/libpq/auth-sasl.c
@@ -172,6 +172,13 @@ CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, char *shadow_pass,
if (output)
{
/*
+ * PG_SASL_EXCHANGE_FAILURE with some output is forbidden by SASL.
+ * Make sure here that the mechanism used got that right.
+ */
+ if (result == PG_SASL_EXCHANGE_FAILURE)
+ elog(ERROR, "output message found after SASL exchange failure");
+
+ /*
* Negotiation generated data to be sent to the client.
*/
elog(DEBUG4, "sending SASL challenge of length %u", outputlen);