• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision5829 (tree)
Time2015-03-27 00:04:45
Author(del#24082)

Log Message

チケット #35010 Unexpected SSH2 message(80)エラー

OpenSSH 6.8で接続エラーが出ないようにした。
"SSH2_MSG_GLOBAL_REQUEST"の正式対応はTBD。

Change Summary

Incremental Difference

--- trunk/ttssh2/ttxssh/ssh.c (revision 5828)
+++ trunk/ttssh2/ttxssh/ssh.c (revision 5829)
@@ -100,6 +100,7 @@
100100 static BOOL handle_SSH2_userauth_banner(PTInstVar pvar);
101101 static BOOL handle_SSH2_open_confirm(PTInstVar pvar);
102102 static BOOL handle_SSH2_open_failure(PTInstVar pvar);
103+static BOOL handle_SSH2_client_global_request(PTInstVar pvar);
103104 static BOOL handle_SSH2_request_success(PTInstVar pvar);
104105 static BOOL handle_SSH2_request_failure(PTInstVar pvar);
105106 static BOOL handle_SSH2_channel_success(PTInstVar pvar);
@@ -1669,7 +1670,7 @@
16691670 enque_handler(pvar, SSH2_MSG_CHANNEL_WINDOW_ADJUST, handle_SSH2_window_adjust);
16701671 enque_handler(pvar, SSH2_MSG_CHANNEL_SUCCESS, handle_SSH2_channel_success);
16711672 enque_handler(pvar, SSH2_MSG_CHANNEL_FAILURE, handle_SSH2_channel_failure);
1672-// enque_handler(pvar, SSH2_MSG_GLOBAL_REQUEST, handle_unimplemented);
1673+ enque_handler(pvar, SSH2_MSG_GLOBAL_REQUEST, handle_SSH2_client_global_request);
16731674 enque_handler(pvar, SSH2_MSG_REQUEST_FAILURE, handle_SSH2_request_failure);
16741675 enque_handler(pvar, SSH2_MSG_REQUEST_SUCCESS, handle_SSH2_request_success);
16751676
@@ -6094,7 +6095,7 @@
60946095 pvar->rekeying = 0;
60956096
60966097 SSH2_dispatch_init(6);
6097- SSH2_dispatch_add_range_message(SSH2_MSG_REQUEST_SUCCESS, SSH2_MSG_CHANNEL_FAILURE);
6098+ SSH2_dispatch_add_range_message(SSH2_MSG_GLOBAL_REQUEST, SSH2_MSG_CHANNEL_FAILURE);
60986099 SSH2_dispatch_add_message(SSH2_MSG_IGNORE); // XXX
60996100 // OpenSSH 3.9ではデータ通信中のDH鍵交換要求が、サーバから送られてくることがある。
61006101 SSH2_dispatch_add_message(SSH2_MSG_KEXINIT);
@@ -7419,6 +7420,49 @@
74197420 }
74207421
74217422
7423+// SSH2_MSG_GLOBAL_REQUEST for OpenSSH 6.8
7424+static BOOL handle_SSH2_client_global_request(PTInstVar pvar)
7425+{
7426+ int len;
7427+ char *data;
7428+ char *rtype;
7429+ int want_reply;
7430+ int success = 0;
7431+ buffer_t *msg;
7432+ unsigned char *outmsg;
7433+ int type;
7434+
7435+ notify_verbose_message(pvar, "SSH2_MSG_GLOBAL_REQUEST was received.", LOG_LEVEL_VERBOSE);
7436+
7437+ // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
7438+ data = pvar->ssh_state.payload;
7439+ // パケットサイズ - (パディングサイズ+1);真のパケットサイズ
7440+ len = pvar->ssh_state.payloadlen;
7441+
7442+ rtype = buffer_get_string(&data, NULL);
7443+ want_reply = data[0];
7444+
7445+ // OpenSSH 6.8では、サーバのホスト鍵が更新されると、下記の通知が来る。
7446+ if (strcmp(rtype, "hostkeys-00@openssh.com") == 0) {
7447+ // TODO: 現状、Tera Termとしては未サポートなので、失敗で返す。
7448+ success = 0;
7449+ }
7450+ free(rtype);
7451+
7452+ msg = buffer_init();
7453+ if (msg) {
7454+ len = buffer_len(msg);
7455+ type = success ? SSH2_MSG_REQUEST_SUCCESS : SSH2_MSG_REQUEST_FAILURE;
7456+ outmsg = begin_send_packet(pvar, type, len);
7457+ memcpy(outmsg, buffer_ptr(msg), len);
7458+ finish_send_packet(pvar);
7459+ buffer_free(msg);
7460+ }
7461+
7462+ return TRUE;
7463+}
7464+
7465+
74227466 // SSH2 port-forwarding (remote -> local)に対するリプライ(成功)
74237467 static BOOL handle_SSH2_request_success(PTInstVar pvar)
74247468 {
Show on old repository browser