| 205 |
memset(c, 0, sizeof(Channel_t)); |
memset(c, 0, sizeof(Channel_t)); |
| 206 |
c->used = 1; |
c->used = 1; |
| 207 |
c->self_id = i; |
c->self_id = i; |
| 208 |
c->remote_id = -1; |
c->remote_id = SSH_CHANNEL_INVALID; |
| 209 |
c->local_window = window; |
c->local_window = window; |
| 210 |
c->local_window_max = window; |
c->local_window_max = window; |
| 211 |
c->local_consumed = 0; |
c->local_consumed = 0; |
| 3046 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 3047 |
return; |
return; |
| 3048 |
} |
} |
| 3049 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 3050 |
|
// この状況は認証完了直後にウィンドウサイズを変更すると発生する。 |
| 3051 |
|
// まだシェルのチャネルに対する SSH_MSG_OPEN_CONFIRMATION を受けていないので、 |
| 3052 |
|
// 相手側のチャネル番号が判らないので window-change メッセージは送らない。 |
| 3053 |
|
logprintf(LOG_LEVEL_WARNING, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 3054 |
|
return; |
| 3055 |
|
} |
| 3056 |
|
|
| 3057 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3058 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 3059 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 3060 |
return; |
return; |
| 3061 |
} |
} |
| 3100 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 3101 |
goto error; |
goto error; |
| 3102 |
} |
} |
| 3103 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 3104 |
|
// 認証直後に send break を行うと発生する |
| 3105 |
|
// まだシェルのチャネルに対する SSH_MSG_OPEN_CONFIRMATION を受けていないので、 |
| 3106 |
|
// 相手側のチャネル番号が判らないので break メッセージは送らない。 |
| 3107 |
|
logprintf(LOG_LEVEL_WARNING, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 3108 |
|
goto error; |
| 3109 |
|
} |
| 3110 |
|
|
| 3111 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3112 |
if (msg == NULL) { |
if (msg == NULL) { |
| 3256 |
|
|
| 3257 |
} else { // for SSH2(yutaka) |
} else { // for SSH2(yutaka) |
| 3258 |
Channel_t *c = ssh2_channel_lookup(pvar->shell_id); |
Channel_t *c = ssh2_channel_lookup(pvar->shell_id); |
| 3259 |
if (c == NULL) { |
if (c == NULL || c->remote_id == SSH_CHANNEL_INVALID) { |
| 3260 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 3261 |
} |
} |
| 3262 |
else { |
else { |
| 3469 |
pvar->session_id_len = 0; |
pvar->session_id_len = 0; |
| 3470 |
|
|
| 3471 |
pvar->userauth_success = 0; |
pvar->userauth_success = 0; |
|
//pvar->remote_id = 0; |
|
| 3472 |
pvar->shell_id = SSH_CHANNEL_INVALID; |
pvar->shell_id = SSH_CHANNEL_INVALID; |
| 3473 |
pvar->session_nego_status = 0; |
pvar->session_nego_status = 0; |
| 3474 |
|
|
| 3548 |
if (buflen > 0) { |
if (buflen > 0) { |
| 3549 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3550 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 3551 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 3552 |
return; |
return; |
| 3553 |
} |
} |
| 3676 |
|
|
| 3677 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3678 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 3679 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 3680 |
return; |
return; |
| 3681 |
} |
} |
| 3754 |
|
|
| 3755 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3756 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 3757 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 3758 |
return; |
return; |
| 3759 |
} |
} |
| 3922 |
|
|
| 3923 |
msg = buffer_init(); |
msg = buffer_init(); |
| 3924 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 3925 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 3926 |
return; |
return; |
| 3927 |
} |
} |
| 3931 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 3932 |
return; |
return; |
| 3933 |
} |
} |
| 3934 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 3935 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 3936 |
|
return; |
| 3937 |
|
} |
| 3938 |
|
|
| 3939 |
// making the fake data |
// making the fake data |
| 3940 |
newlen = 2 * auth_data_len + 1; |
newlen = 2 * auth_data_len + 1; |
| 8104 |
|
|
| 8105 |
msg = buffer_init(); |
msg = buffer_init(); |
| 8106 |
if (msg == NULL) { |
if (msg == NULL) { |
| 8107 |
|
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 8108 |
|
return FALSE; |
| 8109 |
|
} |
| 8110 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 8111 |
|
logprintf(LOG_LEVEL_ERROR, "%s: invalid remote channel number (%d).", __FUNCTION__, c->remote_id); |
| 8112 |
return FALSE; |
return FALSE; |
| 8113 |
} |
} |
| 8114 |
|
|
| 8151 |
// pty open |
// pty open |
| 8152 |
msg = buffer_init(); |
msg = buffer_init(); |
| 8153 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 8154 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (msg)", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (msg)", __FUNCTION__); |
| 8155 |
return FALSE; |
return FALSE; |
| 8156 |
} |
} |
| 8157 |
ttymsg = buffer_init(); |
ttymsg = buffer_init(); |
| 8158 |
if (ttymsg == NULL) { |
if (ttymsg == NULL) { |
|
// TODO: error check |
|
| 8159 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (ttymsg)", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (ttymsg)", __FUNCTION__); |
| 8160 |
buffer_free(msg); |
buffer_free(msg); |
| 8161 |
return FALSE; |
return FALSE; |
| 8255 |
|
|
| 8256 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 8257 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 8258 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 8259 |
return FALSE; |
return FALSE; |
| 8260 |
} |
} |
| 8261 |
|
|
|
// TODO: id check |
|
| 8262 |
remote_id = get_uint32_MSBfirst(data); |
remote_id = get_uint32_MSBfirst(data); |
| 8263 |
data += 4; |
data += 4; |
| 8264 |
|
|
| 8367 |
|
|
| 8368 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 8369 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: SSH2_MSG_DISCONNECTを送る |
|
| 8370 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 8371 |
return FALSE; |
return FALSE; |
| 8372 |
} |
} |
| 8509 |
pvar->session_nego_status); |
pvar->session_nego_status); |
| 8510 |
|
|
| 8511 |
if (pvar->session_nego_status == 1) { |
if (pvar->session_nego_status == 1) { |
|
// find channel by shell id(2005.2.27 yutaka) |
|
| 8512 |
c = ssh2_channel_lookup(pvar->shell_id); |
c = ssh2_channel_lookup(pvar->shell_id); |
| 8513 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: error check |
|
| 8514 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 8515 |
return FALSE; |
return FALSE; |
| 8516 |
} |
} |
| 8517 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 8518 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 8519 |
|
return FALSE; |
| 8520 |
|
} |
| 8521 |
pvar->agentfwd_enable = TRUE; |
pvar->agentfwd_enable = TRUE; |
| 8522 |
return send_pty_request(pvar, c); |
return send_pty_request(pvar, c); |
| 8523 |
|
|
| 8524 |
} else if (pvar->session_nego_status == 2) { |
} else if (pvar->session_nego_status == 2) { |
| 8525 |
pvar->session_nego_status = 3; |
pvar->session_nego_status = 3; |
| 8526 |
|
|
|
// find channel by shell id(2005.2.27 yutaka) |
|
| 8527 |
c = ssh2_channel_lookup(pvar->shell_id); |
c = ssh2_channel_lookup(pvar->shell_id); |
| 8528 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: error check |
|
| 8529 |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__); |
| 8530 |
return FALSE; |
return FALSE; |
| 8531 |
} |
} |
| 8532 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 8533 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 8534 |
|
return FALSE; |
| 8535 |
|
} |
| 8536 |
|
|
| 8537 |
if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) { |
if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) { |
| 8538 |
return FALSE;; |
return FALSE;; |
| 8565 |
|
|
| 8566 |
c = ssh2_channel_lookup(channel_id); |
c = ssh2_channel_lookup(channel_id); |
| 8567 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: error check |
|
| 8568 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, channel_id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, channel_id); |
| 8569 |
return FALSE; |
return FALSE; |
| 8570 |
} |
} |
| 8613 |
// pty open |
// pty open |
| 8614 |
msg = buffer_init(); |
msg = buffer_init(); |
| 8615 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 8616 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 8617 |
return; |
return; |
| 8618 |
} |
} |
| 8648 |
// SSH2 serverにchannel closeを伝える |
// SSH2 serverにchannel closeを伝える |
| 8649 |
msg = buffer_init(); |
msg = buffer_init(); |
| 8650 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 8651 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 8652 |
return; |
return; |
| 8653 |
} |
} |
| 9327 |
|
|
| 9328 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 9329 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 9330 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9331 |
return FALSE; |
return FALSE; |
| 9332 |
} |
} |
| 9333 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 9334 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 9335 |
|
return FALSE; |
| 9336 |
|
} |
| 9337 |
|
|
| 9338 |
// string length |
// string length |
| 9339 |
str_len = get_uint32_MSBfirst(data); |
str_len = get_uint32_MSBfirst(data); |
| 9351 |
"len:%d local_maxpacket:%d", __FUNCTION__, str_len, c->local_maxpacket); |
"len:%d local_maxpacket:%d", __FUNCTION__, str_len, c->local_maxpacket); |
| 9352 |
} |
} |
| 9353 |
if (str_len > c->local_window) { |
if (str_len > c->local_window) { |
|
// TODO: logging |
|
| 9354 |
// local window sizeより大きなパケットは捨てる |
// local window sizeより大きなパケットは捨てる |
| 9355 |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. " |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. " |
| 9356 |
"len:%d local_window:%d", __FUNCTION__, str_len, c->local_window); |
"len:%d local_window:%d", __FUNCTION__, str_len, c->local_window); |
| 9414 |
|
|
| 9415 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 9416 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 9417 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9418 |
return FALSE; |
return FALSE; |
| 9419 |
} |
} |
| 9420 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 9421 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 9422 |
|
return FALSE; |
| 9423 |
|
} |
| 9424 |
|
|
| 9425 |
// data_type_code |
// data_type_code |
| 9426 |
data_type = get_uint32_MSBfirst(data); |
data_type = get_uint32_MSBfirst(data); |
| 9432 |
|
|
| 9433 |
// バッファサイズのチェック |
// バッファサイズのチェック |
| 9434 |
if (strlen > c->local_maxpacket) { |
if (strlen > c->local_maxpacket) { |
|
// TODO: logging |
|
| 9435 |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_maxpacket. " |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_maxpacket. " |
| 9436 |
"len:%d local_maxpacket:%d", __FUNCTION__, strlen, c->local_maxpacket); |
"len:%d local_maxpacket:%d", __FUNCTION__, strlen, c->local_maxpacket); |
| 9437 |
} |
} |
| 9438 |
if (strlen > c->local_window) { |
if (strlen > c->local_window) { |
|
// TODO: logging |
|
| 9439 |
// local window sizeより大きなパケットは捨てる |
// local window sizeより大きなパケットは捨てる |
| 9440 |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. " |
logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. " |
| 9441 |
"len:%d local_window:%d", __FUNCTION__, strlen, c->local_window); |
"len:%d local_window:%d", __FUNCTION__, strlen, c->local_window); |
| 9493 |
|
|
| 9494 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 9495 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 9496 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9497 |
return FALSE; |
return FALSE; |
| 9498 |
} |
} |
| 9610 |
|
|
| 9611 |
free(orig_str); |
free(orig_str); |
| 9612 |
|
|
| 9613 |
// X server(port 6000)へ接続する。接続に失敗するとTera Term自身が切断される。 |
// X server へ接続する。 |
|
// TODO: 将来、切断されないようにしたい。(2005.7.3 yutaka) |
|
| 9614 |
FWD_X11_open(pvar, remote_id, NULL, 0, &chan_num); |
FWD_X11_open(pvar, remote_id, NULL, 0, &chan_num); |
| 9615 |
|
|
| 9616 |
// channelをアロケートし、必要な情報(remote window size)をここで取っておく。 |
// channelをアロケートし、必要な情報(remote window size)をここで取っておく。 |
| 9647 |
else { |
else { |
| 9648 |
msg = buffer_init(); |
msg = buffer_init(); |
| 9649 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 9650 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 9651 |
return FALSE; |
return FALSE; |
| 9652 |
} |
} |
| 9696 |
data += 4; |
data += 4; |
| 9697 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 9698 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 9699 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9700 |
return FALSE; |
return FALSE; |
| 9701 |
} |
} |
| 9755 |
data += 4; |
data += 4; |
| 9756 |
c = ssh2_channel_lookup(id); |
c = ssh2_channel_lookup(id); |
| 9757 |
if (c == NULL) { |
if (c == NULL) { |
|
// TODO: |
|
| 9758 |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9759 |
return FALSE; |
return FALSE; |
| 9760 |
} |
} |
| 9761 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 9762 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 9763 |
|
return FALSE; |
| 9764 |
|
} |
| 9765 |
|
|
| 9766 |
request = buffer_get_string(&data, NULL); |
request = buffer_get_string(&data, NULL); |
| 9767 |
|
|
| 9804 |
|
|
| 9805 |
msg = buffer_init(); |
msg = buffer_init(); |
| 9806 |
if (msg == NULL) { |
if (msg == NULL) { |
|
// TODO: error check |
|
| 9807 |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__); |
| 9808 |
return FALSE; |
return FALSE; |
| 9809 |
} |
} |
| 9854 |
logprintf(LOG_LEVEL_WARNING, "%s: channel not found. (%d)", __FUNCTION__, id); |
logprintf(LOG_LEVEL_WARNING, "%s: channel not found. (%d)", __FUNCTION__, id); |
| 9855 |
return TRUE; |
return TRUE; |
| 9856 |
} |
} |
| 9857 |
|
if (c->remote_id == SSH_CHANNEL_INVALID) { |
| 9858 |
|
logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__); |
| 9859 |
|
return FALSE; |
| 9860 |
|
} |
| 9861 |
|
|
| 9862 |
adjust = get_uint32_MSBfirst(data); |
adjust = get_uint32_MSBfirst(data); |
| 9863 |
data += 4; |
data += 4; |