[Ttssh2-commit] [5678] SSH2 切断シーケンスの調整

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2014年 10月 4日 (土) 12:39:29 JST


Revision: 5678
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5678
Author:   maya
Date:     2014-10-04 12:39:24 +0900 (Sat, 04 Oct 2014)
Log Message:
-----------
SSH2 切断シーケンスの調整
・shell のチャネルが MSG_CHANNEL_CLOSE を受け取ったとき
  MSG_DISCONNECT を送り、MSG_CHANNEL_CLOSE を送り、socket を切断する
  ↓
  MSG_CHANNEL_CLOSE を送り、MSG_DISCONNECT を送り、socket を切断する
・認証中にユーザがキャンセルしたとき
  MSG_CHANNEL_CLOSE を送り、socket を切断する
  ↓
  MSG_DISCONNECT を送り、socket を切断する
・MSG_DISCONNECT を受け取ったとき
  MSG_CHANNEL_CLOSE を送り、socket を切断する
    ↓
  socket を切断する

Modified Paths:
--------------
    trunk/ttssh2/ttxssh/auth.c
    trunk/ttssh2/ttxssh/crypt.c
    trunk/ttssh2/ttxssh/hosts.c
    trunk/ttssh2/ttxssh/kex.c
    trunk/ttssh2/ttxssh/pkt.c
    trunk/ttssh2/ttxssh/ssh.c
    trunk/ttssh2/ttxssh/ttxssh.c
    trunk/ttssh2/ttxssh/ttxssh.h

-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/auth.c
===================================================================
--- trunk/ttssh2/ttxssh/auth.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/auth.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -866,7 +866,7 @@
 		case IDCANCEL:			/* kill the connection */
 canceled:
 			pvar->auth_state.auth_dialog = NULL;
-			notify_closed_connection(pvar);
+			notify_closed_connection(pvar, "authentication cancelled");
 			EndDialog(dlg, 0);
 
 			if (DlgAuthFont != NULL) {
@@ -969,7 +969,7 @@
 		UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
 		                  "Server does not support any of the authentication options\n"
 		                  "provided by TTSSH. This connection will now close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return 0;
 	} else {
 		if (pvar->auth_state.auth_dialog != NULL) {
@@ -1189,7 +1189,7 @@
 
 		case IDCANCEL:			/* kill the connection */
 			pvar->auth_state.auth_dialog = NULL;
-			notify_closed_connection(pvar);
+			notify_closed_connection(pvar, "authentication cancelled");
 			EndDialog(dlg, 0);
 
 			if (DlgTisFont != NULL) {
@@ -1232,7 +1232,7 @@
 			UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
 			                  "Unable to display authentication dialog box.\n"
 			                  "Connection terminated.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		}
 	}
 }

Modified: trunk/ttssh2/ttxssh/crypt.c
===================================================================
--- trunk/ttssh2/ttxssh/crypt.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/crypt.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -235,7 +235,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "AES128/192/256", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -243,7 +243,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "AES128/192/256");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -283,7 +283,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "AES128/192/256", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -291,7 +291,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "AES128/192/256");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -333,7 +333,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "3DES-CBC", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -341,7 +341,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "3DES-CBC");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -381,7 +381,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "3DES-CBC", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -389,7 +389,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "3DES-CBC");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -430,7 +430,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Blowfish", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -438,7 +438,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Blowfish");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -469,7 +469,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Blowfish", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -477,7 +477,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Blowfish");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -509,7 +509,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Arcfour", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -517,7 +517,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Arcfour");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -548,7 +548,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Arcfour", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -556,7 +556,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Arcfour");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -588,7 +588,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "CAST128", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -596,7 +596,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "CAST128");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -627,7 +627,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "CAST128", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -635,7 +635,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "CAST128");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -666,7 +666,7 @@
 		                  "%s encrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Camellia128/192/256", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -674,7 +674,7 @@
 		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Camellia128/192/256");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -705,7 +705,7 @@
 		                  "%s decrypt error(1): bytes %d (%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Camellia128/192/256", bytes, block_size);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 	}
 
@@ -713,7 +713,7 @@
 		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
 		            "Camellia128/192/256");
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		goto error;
 
 	} else {
@@ -881,7 +881,7 @@
 	if (key == NULL || key->e == NULL || key->n == NULL) {
 		UTIL_get_lang_msg("MSG_RSAKEY_SETUP_ERROR", pvar,
 		                  "Error setting up RSA keys");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 
 		if (key != NULL) {
 			if (key->e != NULL) {
@@ -981,14 +981,14 @@
 		                  "The server does not support any of the TTSSH encryption algorithms.\n"
 		                  "A secure connection cannot be made in the TTSSH-to-server direction.\n"
 		                  "The connection will be closed.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	} else if (receiver_ciphers == 0) {
 		UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar,
 		                  "The server does not support any of the TTSSH encryption algorithms.\n"
 		                  "A secure connection cannot be made in the TTSSH-to-server direction.\n"
 		                  "The connection will be closed.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	} else {
 		return TRUE;
@@ -1160,7 +1160,7 @@
 		                  "To communicate with this server, you will have to enable some more ciphers\n"
 		                  "in the TTSSH Setup dialog box when you run Tera Term again.\n"
 		                  "This connection will now close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	} else {
 		return TRUE;
@@ -1204,7 +1204,7 @@
 	if (bit_delta < 128 || server_key_bits < 512 || host_key_bits < 512) {
 		UTIL_get_lang_msg("MSG_RASKEY_TOOWEAK_ERROR", pvar,
 		                  "Server RSA keys are too weak. A secure connection cannot be established.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return 0;
 	} else {
 		/* following Goldberg's code, I'm using MD5(servkey->n || hostkey->n || cookie)
@@ -1381,7 +1381,7 @@
 		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
 		                  "Cipher initialize error(%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 1);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
 
@@ -1391,7 +1391,7 @@
 			UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
 			                  "Cipher initialize error(%d)");
 			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 2);
-			notify_fatal_error(pvar, tmp);
+			notify_fatal_error(pvar, tmp, TRUE);
 			return;
 		}
 	}
@@ -1399,7 +1399,7 @@
 		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
 		                  "Cipher initialize error(%d)");
 		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3);
-		notify_fatal_error(pvar, tmp);
+		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
 
@@ -1412,7 +1412,7 @@
 			                  "Cipher initialize error(%d)");
 			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE,
 			            pvar->ts->UIMsg, 3);
-			notify_fatal_error(pvar, tmp);
+			notify_fatal_error(pvar, tmp, TRUE);
 		}
 		else {
 			memset(discard, 0, discard_len);
@@ -1781,7 +1781,7 @@
 	if (!isOK) {
 		UTIL_get_lang_msg("MSG_CHPHER_NOTSELECTED_ERROR", pvar,
 		                  "No cipher selected!");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	} else {
 		memset(encryption_key, 0, CRYPT_KEY_LENGTH);

Modified: trunk/ttssh2/ttxssh/hosts.c
===================================================================
--- trunk/ttssh2/ttxssh/hosts.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/hosts.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -676,7 +676,7 @@
 				UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_INVALID_ERROR", pvar,
 				                  "The host name contains an invalid character.\n"
 				                  "This session will be terminated.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			}
 			return 0;
 		}
@@ -687,7 +687,7 @@
 			UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_EMPTY_ERROR", pvar,
 			                  "The host name should not be empty.\n"
 			                  "This session will be terminated.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		}
 		return 0;
 	}
@@ -1423,7 +1423,7 @@
 		case IDCANCEL:			/* kill the connection */
 canceled:
 			pvar->hosts_state.hosts_dialog = NULL;
-			notify_closed_connection(pvar);
+			notify_closed_connection(pvar, "authentication cancelled");
 			EndDialog(dlg, 0);
 
 			if (DlgHostsAddFont != NULL) {
@@ -1573,7 +1573,7 @@
 		case IDCANCEL:			/* kill the connection */
 canceled:
 			pvar->hosts_state.hosts_dialog = NULL;
-			notify_closed_connection(pvar);
+			notify_closed_connection(pvar, "authentication cancelled");
 			EndDialog(dlg, 0);
 
 			if (DlgHostsReplaceFont != NULL) {
@@ -1725,7 +1725,7 @@
 		case IDCANCEL:			/* kill the connection */
 canceled:
 			pvar->hosts_state.hosts_dialog = NULL;
-			notify_closed_connection(pvar);
+			notify_closed_connection(pvar, "authentication cancelled");
 			EndDialog(dlg, 0);
 
 			if (DlgHostsAddFont != NULL) {

Modified: trunk/ttssh2/ttxssh/kex.c
===================================================================
--- trunk/ttssh2/ttxssh/kex.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/kex.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -120,7 +120,7 @@
 	return;
 
 error:;
-	notify_fatal_error(pvar, "error occurred @ dh_gen_key()");
+	notify_fatal_error(pvar, "error occurred @ dh_gen_key()", TRUE);
 
 }
 

Modified: trunk/ttssh2/ttxssh/pkt.c
===================================================================
--- trunk/ttssh2/ttxssh/pkt.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/pkt.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -246,7 +246,7 @@
 				// \x8E\xC0\x8Dۂɂ̓f\x81[\x83^\x89\xBB\x82\xAF\x82ŕ\x9C\x8D\x86\x8E\xB8\x94s\x8E\x9E\x82ɁA\x8C\xEB\x94F\x8E\xAF\x82\xB7\x82邱\x82Ƃ\xAA\x91\xBD\x82\xA2\x81B
 				UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
 				                  "Oversized packet received from server; connection will close.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			} else {
 				int amount_read =
 					recv_data(pvar, max(total_packet_size, READAMOUNT));

Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/ssh.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -614,7 +614,7 @@
 			default:
 				UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar,
 				                  "Invalid compressed data in received packet");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				return -1;
 			}
 		}
@@ -646,7 +646,7 @@
 			                  "Received truncated packet (%ld > %d) @ grab_payload()");
 			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
 			            pvar->ssh_state.payload_grabbed, in_buffer);
-			notify_fatal_error(pvar, buf);
+			notify_fatal_error(pvar, buf, TRUE);
 			return FALSE;
 		} else {
 			return TRUE;
@@ -670,7 +670,7 @@
 			                  "Received truncated packet (%ld > %d) @ grab_payload_limited()");
 			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
 			            pvar->ssh_state.payload_grabbed, in_buffer);
-			notify_fatal_error(pvar, buf);
+			notify_fatal_error(pvar, buf, TRUE);
 			return FALSE;
 		} else {
 			return TRUE;
@@ -696,7 +696,7 @@
 		if (CRYPT_detect_attack(pvar, pvar->ssh_state.payload, len)) {
 			UTIL_get_lang_msg("MSG_SSH_COREINS_ERROR", pvar,
 			                  "'CORE insertion attack' detected.  Aborting connection.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		}
 
 		CRYPT_decrypt(pvar, pvar->ssh_state.payload, len);
@@ -705,7 +705,7 @@
 			get_uint32_MSBfirst(pvar->ssh_state.payload + len - 4)) {
 			UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar,
 			                  "Detected corrupted data; connection terminating.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			return SSH_MSG_NONE;
 		}
 
@@ -727,7 +727,7 @@
 			 data + len + 4)) {
 			UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar,
 			                  "Detected corrupted data; connection terminating.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			return SSH_MSG_NONE;
 		}
 
@@ -890,7 +890,7 @@
 		UTIL_get_lang_msg("MSG_SSH_SEND_PKT_ERROR", pvar,
 		                  "A communications error occurred while sending an SSH packet.\n"
 		                  "The connection will close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	} else {
 		return TRUE;
@@ -928,7 +928,7 @@
 	                  "The connection will close. (%s:%d)");
 	_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
 	            kind, code);
-	notify_fatal_error(pvar, buf);
+	notify_fatal_error(pvar, buf, TRUE);
 	return FALSE;
 #endif
 }
@@ -960,7 +960,7 @@
 				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 				                  "An error occurred while compressing packet data.\n"
 				                  "The connection will close.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				return;
 			}
 		}
@@ -1025,7 +1025,7 @@
 				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 				                  "An error occurred while compressing packet data.\n"
 				                  "The connection will close.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				return;
 			}
 			data = buffer_ptr(msg);
@@ -1421,8 +1421,16 @@
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
 		            pvar->ts->UIMsg, explanation);
 	}
-	notify_fatal_error(pvar, buf);
 
+	if (SSHv2(pvar)) {
+		// SSH2_MSG_DISCONNECT \x82\xF0\x8E󂯎\xE6\x82\xC1\x82\xBD\x82\xA0\x82Ƃ͉\xBD\x82\xE0\x91\x97\x90M\x82\xB5\x82Ă͂\xA2\x82\xAF\x82Ȃ\xA2
+		notify_fatal_error(pvar, buf, FALSE);
+	}
+	else {
+		// SSH1 \x82̏ꍇ\x82̎d\x97l\x82\xAA\x95\xAA\x82\xA9\x82\xE7\x82Ȃ\xA2\x82̂ŁA\x88ȑO\x82̂܂܂ɂ\xB5\x82Ă\xA8\x82\xAD
+		notify_fatal_error(pvar, buf, TRUE);
+	}
+
 	return TRUE;
 }
 
@@ -1724,19 +1732,19 @@
 			if (!parse_protocol_ID(pvar, ID)) {
 				UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar,
 				                  "This program does not understand the server's version of the protocol.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			}
 			else if ((negotiate = negotiate_protocol(pvar)) == 1) {
 				UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar,
 				                  "This program does not understand the server's version of the protocol.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			}
 			else if (negotiate == -1) {
 				UTIL_get_lang_msg("MSG_SSH_VERSION_MISMATCH", pvar,
 				                  "Protocol version mismatch. server:%d.%d client:%d");
 				_snprintf_s(uimsg, sizeof(uimsg), _TRUNCATE, pvar->ts->UIMsg,
 				            pvar->protocol_major, pvar->protocol_minor, pvar->settings.ssh_protocol_version);
-				notify_fatal_error(pvar, uimsg);
+				notify_fatal_error(pvar, uimsg, TRUE);
 			}
 			else {
 				char TTSSH_ID[1024];
@@ -1770,7 +1778,7 @@
 					UTIL_get_lang_msg("MSG_SSH_SEND_ID_ERROR", pvar,
 					                  "An error occurred while sending the SSH ID string.\n"
 					                  "The connection will close.");
-					notify_fatal_error(pvar, pvar->ts->UIMsg);
+					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				} else {
 					// \x89\xFC\x8Ds\x83R\x81[\x83h\x82̏\x9C\x8B\x8E (2004.8.4 yutaka)
 					pvar->client_version_string[--TTSSH_ID_len] = 0; // \n
@@ -1807,7 +1815,7 @@
 	if (grab_payload(pvar, 4)) {
 		begin_send_packet(pvar, SSH_CMSG_EXIT_CONFIRMATION, 0);
 		finish_send_packet(pvar);
-		notify_closed_connection(pvar);
+		notify_closed_connection(pvar, "disconnected by server request");
 	}
 	return TRUE;
 }
@@ -2080,7 +2088,7 @@
 								  "Unexpected SSH2 message(%d) on current stage(%d)");
 				_snprintf_s(buf, sizeof(buf), _TRUNCATE,
 					pvar->ts->UIMsg, message, handle_message_stage);
-				notify_fatal_error(pvar, buf);
+				notify_fatal_error(pvar, buf, TRUE);
 				// abort
 			}
 		}
@@ -2093,7 +2101,7 @@
 				                  "Unexpected packet type received: %d");
 				_snprintf_s(buf, sizeof(buf), _TRUNCATE,
 					pvar->ts->UIMsg, message, handle_message_stage);
-				notify_fatal_error(pvar, buf);
+				notify_fatal_error(pvar, buf, TRUE);
 			} else {
 				unsigned char FAR *outmsg =
 					begin_send_packet(pvar, SSH2_MSG_UNIMPLEMENTED, 4);
@@ -2223,7 +2231,7 @@
 		UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar,
 		                  "An error occurred while setting up compression.\n"
 		                  "The connection will close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return;
 	} else {
 		// SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka)
@@ -2252,7 +2260,7 @@
 		UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar,
 		                  "An error occurred while setting up compression.\n"
 		                  "The connection will close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return;
 	} else {
 		// SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka)
@@ -2362,7 +2370,7 @@
 				UTIL_get_lang_msg("MSG_SSH_DECRYPT_RSA_ERROR", pvar,
 								  "An error occurred while decrypting the RSA challenge.\n"
 								  "Perhaps the key file is corrupted.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			}
 		}
 		else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
@@ -2580,7 +2588,7 @@
 		default:
 			UTIL_get_lang_msg("MSG_SSH_UNSUPPORT_AUTH_METHOD_ERROR", pvar,
 			                  "Internal error: unsupported authentication method");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			return;
 		}
 
@@ -2734,32 +2742,28 @@
 	} else { // for SSH2(yutaka)
 		buffer_t *msg;
 		unsigned char *outmsg;
+		char *s;
 		int len;
-		Channel_t *c;
 
-		c = ssh2_channel_lookup(pvar->shell_id);
-		if (c == NULL)
-			return;
-
-		// SSH2 server\x82\xC9channel close\x82\xF0\x93`\x82\xA6\x82\xE9
+		// SSH2 server\x82\xC9disconnect\x82\xF0\x93`\x82\xA6\x82\xE9
 		msg = buffer_init();
 		if (msg == NULL) {
 			// TODO: error check
 			return;
 		}
-		buffer_put_int(msg, c->remote_id);
+		buffer_put_int(msg, SSH2_DISCONNECT_BY_APPLICATION);
+		buffer_put_string(msg, reason, strlen(reason));
+		s = "";
+		buffer_put_string(msg, s, strlen(s));
 
 		len = buffer_len(msg);
-		outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_CLOSE, len);
+		outmsg = begin_send_packet(pvar, SSH2_MSG_DISCONNECT, len);
 		memcpy(outmsg, buffer_ptr(msg), len);
 		finish_send_packet(pvar);
 		buffer_free(msg);
 
-		c->state |= SSH_CHANNEL_STATE_CLOSE_SENT;
-
-		notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_CLOSE was sent at SSH_notify_disconnecting().", LOG_LEVEL_VERBOSE);
+		notify_verbose_message(pvar, "SSH2_MSG_DISCONNECT was sent at SSH_notify_disconnecting().", LOG_LEVEL_VERBOSE);
 	}
-
 }
 
 void SSH_notify_host_OK(PTInstVar pvar)
@@ -2971,7 +2975,7 @@
 				if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) {
 					UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 									  "Error compressing packet data");
-					notify_fatal_error(pvar, pvar->ts->UIMsg);
+					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 					return;
 				}
 
@@ -2982,7 +2986,7 @@
 				if (deflate(&pvar->ssh_state.compress_stream, Z_SYNC_FLUSH) != Z_OK) {
 					UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 					                  "Error compressing packet data");
-					notify_fatal_error(pvar, pvar->ts->UIMsg);
+					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 					return;
 				}
 			} else {
@@ -3022,7 +3026,7 @@
 		if (inflate(&pvar->ssh_state.decompress_stream, Z_SYNC_FLUSH) != Z_OK) {
 			UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar,
 			                  "Invalid compressed data in received packet");
-			notify_fatal_error(pvar, pvar->ts->UIMsg);
+			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 			return 0;
 		}
 	}
@@ -3324,7 +3328,7 @@
 			if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) {
 				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 				                  "Error compressing packet data");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				return;
 			}
 
@@ -3336,7 +3340,7 @@
 				Z_OK) {
 				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
 				                  "Error compressing packet data");
-				notify_fatal_error(pvar, pvar->ts->UIMsg);
+				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 				return;
 			}
 		} else {
@@ -3810,7 +3814,7 @@
 	if (c == NULL) {
 		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
 		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		goto error;
 	}
 
@@ -3950,7 +3954,7 @@
 	if (c == NULL) {
 		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
 		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		goto error;
 	}
 
@@ -5066,7 +5070,7 @@
 	buffer_free(pvar->peer_kex);
 	pvar->peer_kex = NULL;
 
-	notify_fatal_error(pvar, msg);
+	notify_fatal_error(pvar, msg, TRUE);
 
 	return FALSE;
 }
@@ -5127,7 +5131,7 @@
 	DH_free(dh);
 	buffer_free(msg);
 
-	notify_fatal_error(pvar, "error occurred @ SSH2_dh_kex_init()");
+	notify_fatal_error(pvar, "error occurred @ SSH2_dh_kex_init()", TRUE);
 }
 
 
@@ -5192,7 +5196,7 @@
 error:;
 	buffer_free(msg);
 
-	notify_fatal_error(pvar, "error occurred @ SSH2_dh_gex_kex_init()");
+	notify_fatal_error(pvar, "error occurred @ SSH2_dh_gex_kex_init()", TRUE);
 }
 
 
@@ -5333,7 +5337,7 @@
 	EC_KEY_free(client_key);
 	buffer_free(msg);
 
-	notify_fatal_error(pvar, "error occurred @ SSH2_ecdh_kex_init()");
+	notify_fatal_error(pvar, "error occurred @ SSH2_ecdh_kex_init()", TRUE);
 }
 
 
@@ -5572,7 +5576,7 @@
 	if (dh_buf != NULL) free(dh_buf);
 	BN_free(share_key);
 
-	notify_fatal_error(pvar, emsg);
+	notify_fatal_error(pvar, emsg, TRUE);
 
 	return FALSE;
 }
@@ -5806,7 +5810,7 @@
 	if (dh_buf != NULL) free(dh_buf);
 	BN_free(share_key);
 
-	notify_fatal_error(pvar, emsg);
+	notify_fatal_error(pvar, emsg, TRUE);
 
 	return FALSE;
 }
@@ -6052,7 +6056,7 @@
 	if (ecdh_buf != NULL) free(ecdh_buf);
 	BN_free(share_key);
 
-	notify_fatal_error(pvar, emsg);
+	notify_fatal_error(pvar, emsg, TRUE);
 
 	return FALSE;
 }
@@ -6622,7 +6626,7 @@
 	if (c == NULL) {
 		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
 		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	}
 	// \x83V\x83F\x83\x8B\x82\xCCID\x82\xF0\x8E\xE6\x82\xC1\x82Ă\xA8\x82\xAD
@@ -6682,7 +6686,7 @@
 	if (cstring == NULL) {
 		UTIL_get_lang_msg("MSG_SSH_SERVER_NO_AUTH_METHOD_ERROR", pvar,
 		                  "The server doesn't have valid authentication method.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg);
+		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
 		return FALSE;
 	}
 
@@ -6763,7 +6767,7 @@
 				strncat_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
 			}
 		}
-		notify_fatal_error(pvar, uimsg);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return TRUE;
 	}
 
@@ -8528,9 +8532,6 @@
 	char *data;
 	int id;
 	Channel_t *c;
-	buffer_t *msg;
-	char *s;
-	unsigned char *outmsg;
 	char log[128];
 
 	// \x83R\x83l\x83N\x83V\x83\x87\x83\x93\x90ؒf\x8E\x9E\x82ɁA\x83p\x83P\x83b\x83g\x83_\x83\x93\x83v\x82\xF0\x83t\x83@\x83C\x83\x8B\x82֑|\x82\xAB\x8Fo\x82\xB7\x81B
@@ -8556,33 +8557,10 @@
 	notify_verbose_message(pvar, log, LOG_LEVEL_VERBOSE);
 
 	if (c->type == TYPE_SHELL) {
-		// notify_closed_connection() \x82\xA9\x82\xE7\x8CĂ΂\xEA\x82\xE9 SSH_notify_disconnecting() \x82̒\x86\x82\xC5
-		// SSH2_MSG_CHANNEL_CLOSE \x82\xAA\x91\x97\x90M\x82\xB3\x82\xEA\x82\xE9\x82̂ɔC\x82\xB9\x82\xE9\x81B
-		// \x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82\xA9\x82\xE7 SSH2_MSG_DISCONNECT \x82𑗂\xE7\x82Ȃ\xAD\x82Ă\xE0\x81A\x82\xB7\x82ׂĂ\xCC CHANNEL \x82\xAA\x95‚\xB6\x82\xEA\x82\xCE
-		// \x83T\x81[\x83o\x82\xA9\x82\xE7 SSH2_MSG_DISCONNECT \x82\xAA\x91\x97\x82\xE7\x82\xEA\x82Ă\xAD\x82邱\x82Ƃ\xF0\x8A\xFA\x91҂\xB7\x82\xE9\x81B
-		/*
-		msg = buffer_init();
-		if (msg == NULL) {
-			// TODO: error check
-			return FALSE;
-		}
-		buffer_put_int(msg, SSH2_DISCONNECT_PROTOCOL_ERROR);
-		s = "disconnected by server request";
-		buffer_put_string(msg, s, strlen(s));
-		s = "";
-		buffer_put_string(msg, s, strlen(s));
+		ssh2_channel_send_close(pvar, c);
 
-		len = buffer_len(msg);
-		outmsg = begin_send_packet(pvar, SSH2_MSG_DISCONNECT, len);
-		memcpy(outmsg, buffer_ptr(msg), len);
-		finish_send_packet(pvar);
-		buffer_free(msg);
-
-		notify_verbose_message(pvar, "SSH2_MSG_DISCONNECT was sent at handle_SSH2_channel_close().", LOG_LEVEL_VERBOSE);
-		*/
-
 		// TCP connection closed
-		notify_closed_connection(pvar);
+		notify_closed_connection(pvar, "disconnected by server request");
 
 	} else if (c->type == TYPE_PORTFWD) {
 		// CHANNEL_CLOSE \x82𑗂\xE8\x95Ԃ\xB3\x82Ȃ\xA2\x82ƃ\x8A\x83\x82\x81[\x83g\x82\xCCchannel\x82\xAA\x8AJ\x95\xFA\x82\xB3\x82\xEA\x82Ȃ\xA2

Modified: trunk/ttssh2/ttxssh/ttxssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.c	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/ttxssh.c	2014-10-04 03:39:24 UTC (rev 5678)
@@ -820,15 +820,14 @@
 	                       LOG_LEVEL_VERBOSE);
 }
 
-void notify_closed_connection(PTInstVar pvar)
+void notify_closed_connection(PTInstVar pvar, char FAR * send_msg)
 {
-	SSH_notify_disconnecting(pvar, NULL);
+	SSH_notify_disconnecting(pvar, send_msg);
 	AUTH_notify_disconnecting(pvar);
 	HOSTS_notify_disconnecting(pvar);
 
 	PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
 	            pvar->socket, MAKELPARAM(FD_CLOSE, 0));
-
 }
 
 static void add_err_msg(PTInstVar pvar, char FAR * msg)
@@ -869,7 +868,7 @@
 	}
 }
 
-void notify_fatal_error(PTInstVar pvar, char FAR * msg)
+void notify_fatal_error(PTInstVar pvar, char FAR * msg, BOOL send_disconnect)
 {
 	if (msg[0] != 0) {
 		notify_verbose_message(pvar, msg, LOG_LEVEL_FATAL);
@@ -879,7 +878,9 @@
 	if (!pvar->fatal_error) {
 		pvar->fatal_error = TRUE;
 
-		SSH_notify_disconnecting(pvar, msg);
+		if (send_disconnect) {
+			SSH_notify_disconnecting(pvar, msg);
+		}
 		AUTH_notify_disconnecting(pvar);
 		HOSTS_notify_disconnecting(pvar);
 

Modified: trunk/ttssh2/ttxssh/ttxssh.h
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.h	2014-10-03 14:32:29 UTC (rev 5677)
+++ trunk/ttssh2/ttxssh/ttxssh.h	2014-10-04 03:39:24 UTC (rev 5678)
@@ -298,9 +298,9 @@
 #define SSHv2(pvar) ((pvar)->protocol_major == 2)
 
 void notify_established_secure_connection(PTInstVar pvar);
-void notify_closed_connection(PTInstVar pvar);
+void notify_closed_connection(PTInstVar pvar, char FAR * send_msg);
 void notify_nonfatal_error(PTInstVar pvar, char FAR * msg);
-void notify_fatal_error(PTInstVar pvar, char FAR * msg);
+void notify_fatal_error(PTInstVar pvar, char FAR * msg, BOOL send_disconnect);
 void notify_verbose_message(PTInstVar pvar, char FAR * msg, int level);
 
 void get_teraterm_dir_relative_name(char FAR * buf, int bufsize, char FAR * basename);



Ttssh2-commit メーリングリストの案内
Back to archive index