Dmitry Belyavskiy a43be1
diff -u -p -r1.166 auth2.c
Dmitry Belyavskiy a43be1
--- a/auth2.c	8 Mar 2023 04:43:12 -0000	1.166
Dmitry Belyavskiy a43be1
+++ b/auth2.c	28 Aug 2023 08:32:44 -0000
Dmitry Belyavskiy a43be1
@@ -208,6 +208,7 @@ input_service_request(int type, u_int32_
Dmitry Belyavskiy a43be1
 }
Dmitry Belyavskiy a43be1
 
Dmitry Belyavskiy a43be1
 #define MIN_FAIL_DELAY_SECONDS 0.005
Dmitry Belyavskiy a43be1
+#define MAX_FAIL_DELAY_SECONDS 5.0
Dmitry Belyavskiy a43be1
 static double
Dmitry Belyavskiy a43be1
 user_specific_delay(const char *user)
Dmitry Belyavskiy a43be1
 {
Dmitry Belyavskiy a43be1
@@ -233,6 +234,12 @@ ensure_minimum_time_since(double start, 
Dmitry Belyavskiy a43be1
 	struct timespec ts;
Dmitry Belyavskiy a43be1
 	double elapsed = monotime_double() - start, req = seconds, remain;
Dmitry Belyavskiy a43be1
 
Dmitry Belyavskiy a43be1
+	if (elapsed > MAX_FAIL_DELAY_SECONDS) {
Dmitry Belyavskiy a43be1
+		debug3_f("elapsed %0.3lfms exceeded the max delay "
Dmitry Belyavskiy a43be1
+		    "requested %0.3lfms)", elapsed*1000, req*1000);
Dmitry Belyavskiy a43be1
+		return;
Dmitry Belyavskiy a43be1
+	}
Dmitry Belyavskiy a43be1
+
Dmitry Belyavskiy a43be1
 	/* if we've already passed the requested time, scale up */
Dmitry Belyavskiy a43be1
 	while ((remain = seconds - elapsed) < 0.0)
Dmitry Belyavskiy a43be1
 		seconds *= 2;
Dmitry Belyavskiy a43be1
@@ -317,7 +324,7 @@ input_userauth_request(int type, u_int32
Dmitry Belyavskiy a43be1
 		debug2("input_userauth_request: try method %s", method);
Dmitry Belyavskiy a43be1
 		authenticated =	m->userauth(ssh);
Dmitry Belyavskiy a43be1
 	}
Dmitry Belyavskiy a43be1
-	if (!authctxt->authenticated)
Dmitry Belyavskiy a43be1
+	if (!authctxt->authenticated && strcmp(method, "none") != 0)
Dmitry Belyavskiy a43be1
 		ensure_minimum_time_since(tstart,
Dmitry Belyavskiy a43be1
 		    user_specific_delay(authctxt->user));
Dmitry Belyavskiy a43be1
 	userauth_finish(ssh, authenticated, method, NULL);