/* GSSAPI can use quite large packets */
#define AUTH_CLIENT_MAX_LINE_LENGTH 16384
+/* Make sure AUTH_CLIENT_MAX_LINE_LENGTH does not exceed the absolute maximum */
+#if AUTH_CLIENT_MAX_LINE_LENGTH > SASL_MAX_MESSAGE_SIZE
+# error "AUTH_CLIENT_MAX_LINE_LENGTH exceeds SASL_MAX_MESSAGE_SIZE"
+#endif
/* auth failure codes */
#define AUTH_CLIENT_FAIL_CODE_AUTHZFAILED "authz_fail"
*error_r = "Unexpected NUL in input data";
return DSASL_CLIENT_RESULT_ERR_PROTOCOL;
}
+ if (input_len > (size_t)SASL_MAX_MESSAGE_SIZE) {
+ *error_r = t_strdup_printf(
+ "Excessive challenge size (> %d)",
+ SASL_MAX_MESSAGE_SIZE);
+ return DSASL_CLIENT_RESULT_ERR_PROTOCOL;
+ }
return client->mech->input(client, input, input_len, error_r);
}
sasl_server_request_unref(rctx);
}
+static bool
+sasl_server_request_fail_on_size(struct sasl_server_request *req,
+ size_t data_size)
+{
+ if (data_size > (size_t)SASL_MAX_MESSAGE_SIZE) {
+ /* We should normally never get here, because the limit enforced
+ by the auth service is smaller.
+ */
+ e_debug(req->event, "Excessive response size (> %d)",
+ SASL_MAX_MESSAGE_SIZE);
+ sasl_server_request_failure(req->mech);
+ return TRUE;
+ }
+ return FALSE;
+}
+
static bool
sasl_server_request_fail_on_nuls(struct sasl_server_request *req,
const unsigned char *data, size_t data_size)
i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW);
req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (sasl_server_request_fail_on_size(req, data_size))
+ return;
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
i_assert(!req->finished_with_data);
req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (sasl_server_request_fail_on_size(req, data_size))
+ return;
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;