| Revision | 5829 (tree) |
|---|---|
| Time | 2015-03-27 00:04:45 |
| Author | (del#24082) |
チケット #35010 Unexpected SSH2 message(80)エラー
OpenSSH 6.8で接続エラーが出ないようにした。
"SSH2_MSG_GLOBAL_REQUEST"の正式対応はTBD。
| @@ -100,6 +100,7 @@ | ||
| 100 | 100 | static BOOL handle_SSH2_userauth_banner(PTInstVar pvar); |
| 101 | 101 | static BOOL handle_SSH2_open_confirm(PTInstVar pvar); |
| 102 | 102 | static BOOL handle_SSH2_open_failure(PTInstVar pvar); |
| 103 | +static BOOL handle_SSH2_client_global_request(PTInstVar pvar); | |
| 103 | 104 | static BOOL handle_SSH2_request_success(PTInstVar pvar); |
| 104 | 105 | static BOOL handle_SSH2_request_failure(PTInstVar pvar); |
| 105 | 106 | static BOOL handle_SSH2_channel_success(PTInstVar pvar); |
| @@ -1669,7 +1670,7 @@ | ||
| 1669 | 1670 | enque_handler(pvar, SSH2_MSG_CHANNEL_WINDOW_ADJUST, handle_SSH2_window_adjust); |
| 1670 | 1671 | enque_handler(pvar, SSH2_MSG_CHANNEL_SUCCESS, handle_SSH2_channel_success); |
| 1671 | 1672 | 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); | |
| 1673 | 1674 | enque_handler(pvar, SSH2_MSG_REQUEST_FAILURE, handle_SSH2_request_failure); |
| 1674 | 1675 | enque_handler(pvar, SSH2_MSG_REQUEST_SUCCESS, handle_SSH2_request_success); |
| 1675 | 1676 |
| @@ -6094,7 +6095,7 @@ | ||
| 6094 | 6095 | pvar->rekeying = 0; |
| 6095 | 6096 | |
| 6096 | 6097 | 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); | |
| 6098 | 6099 | SSH2_dispatch_add_message(SSH2_MSG_IGNORE); // XXX |
| 6099 | 6100 | // OpenSSH 3.9ではデータ通信中のDH鍵交換要求が、サーバから送られてくることがある。 |
| 6100 | 6101 | SSH2_dispatch_add_message(SSH2_MSG_KEXINIT); |
| @@ -7419,6 +7420,49 @@ | ||
| 7419 | 7420 | } |
| 7420 | 7421 | |
| 7421 | 7422 | |
| 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 | + | |
| 7422 | 7466 | // SSH2 port-forwarding (remote -> local)に対するリプライ(成功) |
| 7423 | 7467 | static BOOL handle_SSH2_request_success(PTInstVar pvar) |
| 7424 | 7468 | { |