summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2014-07-09 22:02:22 +0800
committerMatt Johnston <matt@ucc.asn.au>2014-07-09 22:02:22 +0800
commit235fb34a9c7933fa50d5cff8e7564774036f2d74 (patch)
tree4672c9ebb53d4cd4fabd4ed2349a042501ab2dde
parentd671d6d3c4d58cf2e0d3d13208430ef70354e097 (diff)
downloaddropbear-235fb34a9c7933fa50d5cff8e7564774036f2d74.tar.gz
Fix auth timeout regression
-rw-r--r--common-session.c5
-rw-r--r--session.h10
-rw-r--r--svr-auth.c3
-rw-r--r--svr-session.c12
4 files changed, 17 insertions, 13 deletions
diff --git a/common-session.c b/common-session.c
index 90129b4..a90673f 100644
--- a/common-session.c
+++ b/common-session.c
@@ -60,7 +60,6 @@ void common_session_init(int sock_in, int sock_out) {
ses.maxfd = MAX(sock_in, sock_out);
now = monotonic_now();
- ses.connect_time = now;
ses.last_packet_time_keepalive_recv = now;
ses.last_packet_time_idle = now;
ses.last_packet_time_any_sent = 0;
@@ -415,10 +414,6 @@ static void checktimeouts() {
time_t now;
now = monotonic_now();
- if (now - ses.connect_time >= AUTH_TIMEOUT) {
- dropbear_close("Timeout before auth");
- }
-
/* we can't rekey if we haven't done remote ident exchange yet */
if (ses.remoteident == NULL) {
return;
diff --git a/session.h b/session.h
index 16a6e37..548dabd 100644
--- a/session.h
+++ b/session.h
@@ -104,11 +104,6 @@ struct sshsession {
/* Is it a client or server? */
unsigned char isserver;
- time_t connect_time; /* time the connection was established
- (cleared after auth once we're not
- respecting AUTH_TIMEOUT any more).
- A monotonic time, not realworld */
-
int sock_in;
int sock_out;
@@ -221,6 +216,11 @@ struct serversession {
/* The resolved remote address, used for lastlog etc */
char *remotehost;
+ time_t connect_time; /* time the connection was established
+ (cleared after auth once we're not
+ respecting AUTH_TIMEOUT any more).
+ A monotonic time, not realworld */
+
#ifdef USE_VFORK
pid_t server_pid;
#endif
diff --git a/svr-auth.c b/svr-auth.c
index 9051d85..89760ef 100644
--- a/svr-auth.c
+++ b/svr-auth.c
@@ -392,8 +392,7 @@ void send_msg_userauth_success() {
/* authdone must be set after encrypt_packet() for
* delayed-zlib mode */
ses.authstate.authdone = 1;
- ses.connect_time = 0;
-
+ svr_ses.connect_time = 0;
if (ses.authstate.pw_uid == 0) {
ses.allowprivport = 1;
diff --git a/svr-session.c b/svr-session.c
index 90d3414..4d3c058 100644
--- a/svr-session.c
+++ b/svr-session.c
@@ -80,12 +80,22 @@ svr_session_cleanup(void)
svr_pubkey_options_cleanup();
}
+static void
+svr_sessionloop() {
+ if (svr_ses.connect_time != 0
+ && monotonic_now() - svr_ses.connect_time >= AUTH_TIMEOUT) {
+ dropbear_close("Timeout before auth");
+ }
+}
+
void svr_session(int sock, int childpipe) {
char *host, *port;
size_t len;
common_session_init(sock, sock);
+ svr_ses.connect_time = monotonic_now();;
+
/* Initialise server specific parts of the session */
svr_ses.childpipe = childpipe;
#ifdef USE_VFORK
@@ -126,7 +136,7 @@ void svr_session(int sock, int childpipe) {
/* Run the main for loop. NULL is for the dispatcher - only the client
* code makes use of it */
- session_loop(NULL);
+ session_loop(svr_sessionloop);
/* Not reached */