From be815535d48f63146b5520aeea9a0ce786ab53d6 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sat, 22 May 2010 01:48:27 +0000
Subject: [PATCH] Work around CRYPT_SESSINFO_AUTHRESPONSE being set before
 setting session active not behaving corretly... assume new behaviour.

---
 src/sbbs3/main.cpp | 58 ++++++++++++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 20 deletions(-)

diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index f7daeb7618..ae1160d253 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -5028,6 +5028,7 @@ NO_SSH:
 		/* Do SSH stuff here */
 
 		if(ssh) {
+			int	ssh_failed=0;
 			if(!cryptStatusOK(i=cryptCreateSession(&sbbs->ssh_session, CRYPT_UNUSED, CRYPT_SESSION_SSH_SERVER))) {
 				lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d creating session", client_socket, i);
 				close_socket(client_socket);
@@ -5039,34 +5040,51 @@ NO_SSH:
 				close_socket(client_socket);
 				continue;
 			}
-			/* Accept any credentials */
-			if(!cryptStatusOK(i=cryptSetAttribute(sbbs->ssh_session, CRYPT_SESSINFO_AUTHRESPONSE, 1))) {
-				lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d setting AUTHRESPONSE",client_socket, i);
-				cryptDestroySession(sbbs->ssh_session);
-				close_socket(client_socket);
-				continue;
-			}
 			if(!cryptStatusOK(i=cryptSetAttribute(sbbs->ssh_session, CRYPT_SESSINFO_NETWORKSOCKET, client_socket))) {
 				lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d setting socket",client_socket, i);
 				cryptDestroySession(sbbs->ssh_session);
 				close_socket(client_socket);
 				continue;
 			}
-			if(!cryptStatusOK(i=cryptSetAttribute(sbbs->ssh_session, CRYPT_SESSINFO_ACTIVE, 1))) {
-				switch(i) {
-					case CRYPT_ERROR_BADDATA:
-						lprintf(LOG_NOTICE,"%04d SSH Bad/unrecognized data format", client_socket);
-						break;
-					case CRYPT_ERROR_READ:
-						lprintf(LOG_WARNING,"%04d SSH Read failure", client_socket);
-						break;
-					case CRYPT_ERROR_WRITE:
-						lprintf(LOG_WARNING,"%04d SSH Write failure", client_socket);
-						break;
-					default:
-						lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d setting session active",client_socket, i);
+			for(ssh_failed=0; ssh_failed < 2; ssh_failed++) {
+				/* Accept any credentials */
+				if(!cryptStatusOK(i=cryptSetAttribute(sbbs->ssh_session, CRYPT_SESSINFO_AUTHRESPONSE, 1))) {
+					ssh_failed=1;
+					break;
+				}
+				if(!cryptStatusOK(i=cryptSetAttribute(sbbs->ssh_session, CRYPT_SESSINFO_ACTIVE, 1))) {
+					if(i != CRYPT_ENVELOPE_RESOURCE) {
+						ssh_failed=2;
 						break;
+					}
 				}
+				else {
+					ssh_failed=0;
+					break;
+				}
+			}
+			switch(ssh_failed) {
+				case 1:
+					lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d setting AUTHRESPONSE",client_socket, i);
+					break;
+				case 2:
+					switch(i) {
+						case CRYPT_ERROR_BADDATA:
+							lprintf(LOG_NOTICE,"%04d SSH Bad/unrecognized data format", client_socket);
+							break;
+						case CRYPT_ERROR_READ:
+							lprintf(LOG_WARNING,"%04d SSH Read failure", client_socket);
+							break;
+						case CRYPT_ERROR_WRITE:
+							lprintf(LOG_WARNING,"%04d SSH Write failure", client_socket);
+							break;
+						default:
+							lprintf(LOG_WARNING,"%04d SSH Cryptlib error %d setting session active",client_socket, i);
+							break;
+					}
+					break;
+			}
+			if(ssh_failed) {
 				cryptDestroySession(sbbs->ssh_session);
 				close_socket(client_socket);
 				continue;
-- 
GitLab