Revision: 10412 https://osdn.net/projects/ttssh2/scm/svn/commits/10412 Author: zmatsuo Date: 2022-12-18 21:20:56 +0900 (Sun, 18 Dec 2022) Log Message: ----------- SSH2 ダイナミックポートフォワーディングを使うと落ちる - 通信テーブルの検索に失敗することがあった - 受信処理が一時停止中かチェックするためにテーブルを参照 - ssh2_local_channel_lookup()#ssh.c で NULL(=失敗)が返ってくる - NULLポインタ参照で落ちていた - まだテーブルが作成されていないため - 作成されていないので、検索に失敗するのが正しい動作 - フォワーディングの接続が確立中(確立前)のため作成されていない - 確立時 fwd-socks.c から SSH_open_channel() がコールされてテーブルが作成される - テーブルが見つからない場合(=接続確立前)でも動作するよう修正した - 場合によって検索に成功することがあった - 失敗するのが正しい動作 - シェル用通信テーブル(type==TYPE_SHELL)を返すことがあった - type==TYPE_PORTFWD のみを検索するよう修正した - フォワーディングが1つの場合に検索に成功していた - 正しくない動作 - 多数確立された場合に検索に失敗する ticket #41886 MFT r10411 Revision Links: -------------- https://osdn.net/projects/ttssh2/scm/svn/commits/10411 Ticket Links: ------------ https://osdn.net/projects/ttssh2/tracker/detail/41886 Modified Paths: -------------- branches/4-stable/ttssh2/ttxssh/fwd.c branches/4-stable/ttssh2/ttxssh/ssh.c -------------- next part -------------- Modified: branches/4-stable/ttssh2/ttxssh/fwd.c =================================================================== --- branches/4-stable/ttssh2/ttxssh/fwd.c 2022-12-18 12:18:04 UTC (rev 10411) +++ branches/4-stable/ttssh2/ttxssh/fwd.c 2022-12-18 12:20:56 UTC (rev 10412) @@ -713,12 +713,13 @@ while (channel->local_socket != INVALID_SOCKET) { char buf[CHANNEL_READ_BUF_SIZE]; int amount; - int err; + int err = ERROR_SUCCESS; // recv\x82̈ꎞ\x92\xE2\x8E~\x92\x86\x82Ȃ\xE7\x82A\x89\xBD\x82\xE0\x82\xB9\x82\xB8\x82ɖ߂\xE9\x81B if (SSHv2(pvar)) { Channel_t* c = ssh2_local_channel_lookup(channel_num); - if (c->bufchain_recv_suspended) { + // \x90ڑ\xB1\x82\xAA\x8Am\x97\xA7\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x8F\xF3\x91Ԃ̊Ԃ\xCD c == NULL \x82\xAA\x95Ԃ\xC1\x82Ă\xAD\x82\xE9 + if (c != NULL && c->bufchain_recv_suspended) { logprintf(LOG_LEVEL_NOTICE, "%s: channel=%d recv was skipped for flow control", __FUNCTION__, channel_num); return; @@ -725,16 +726,20 @@ } } + // \x8E\xF3\x90M(\x83m\x83\x93\x83u\x83\x8D\x83b\x83L\x83\x93\x83O\x83\x82\x81[\x83h) amount = recv(channel->local_socket, buf, sizeof(buf), 0); - // X\x83T\x81[\x83o\x82\xA9\x82\xE7\x82̃f\x81[\x83^\x8E\xF3\x90M\x82\xAA\x82\xA0\x82\xEA\x82A\x83m\x83\x93\x83u\x83\x8D\x83b\x83L\x83\x93\x83O\x83\x82\x81[\x83h\x82Ń\\x83P\x83b\x83g\x8E\xF3\x90M\x82\xF0\x8Ds\x82\xA2\x81A - // SSH\x83T\x81[\x83o\x82\xCCX\x83A\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x82֑\x97\x90M\x82\xB7\x82\xE9\x81B - //OutputDebugPrintf("%s: recv %d\n", __FUNCTION__, amount); - if (amount > 0) { + // \x8E\xF3\x90M\x83f\x81[\x83^\x82\xA0\x82\xE8 char *new_buf = buf; FwdFilterResult action = FWD_FILTER_RETAIN; +#if 1 + logprintf(LOG_LEVEL_VERBOSE, "%s: recv()=%d", __FUNCTION__, amount); +#else + logprintf_hexdump(LOG_LEVEL_VERBOSE, buf, amount, "%s: recv()=%d", __FUNCTION__, amount); +#endif + if (channel->filter != NULL) { action = channel->filter(channel->filter_closure, FWD_FILTER_FROM_CLIENT, &amount, &new_buf); } @@ -755,6 +760,9 @@ break; } } else if (amount == 0 || (err = WSAGetLastError()) == WSAEWOULDBLOCK) { + // \x8E\xF3\x90M\x83f\x81[\x83^\x82\xAA\x82Ȃ\xA2 + logprintf(LOG_LEVEL_VERBOSE, "%s: recv()=%d err=%s(%d)", __FUNCTION__, amount, + err == WSAEWOULDBLOCK ? "WSAEWOULDBLOCK" : "-", err); return; } else { channel_error(pvar, "reading", channel_num, err); Modified: branches/4-stable/ttssh2/ttxssh/ssh.c =================================================================== --- branches/4-stable/ttssh2/ttxssh/ssh.c 2022-12-18 12:18:04 UTC (rev 10411) +++ branches/4-stable/ttssh2/ttxssh/ssh.c 2022-12-18 12:20:56 UTC (rev 10412) @@ -411,6 +411,8 @@ for (i = 0 ; i < CHANNEL_MAX ; i++) { c = &channels[i]; + if (c->type != TYPE_PORTFWD) + continue; if (c->local_num == local_num) return (c); }