[ttssh2-commit] [10411] SSH2 ダイナミックポートフォワーディングを使うと落ちる

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2022年 12月 18日 (日) 21:18:04 JST


Revision: 10411
          https://osdn.net/projects/ttssh2/scm/svn/commits/10411
Author:   zmatsuo
Date:     2022-12-18 21:18:04 +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

Ticket Links:
------------
    https://osdn.net/projects/ttssh2/tracker/detail/41886

Modified Paths:
--------------
    trunk/ttssh2/ttxssh/fwd.c
    trunk/ttssh2/ttxssh/ssh.c

-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/fwd.c
===================================================================
--- trunk/ttssh2/ttxssh/fwd.c	2022-12-13 14:43:03 UTC (rev 10410)
+++ trunk/ttssh2/ttxssh/fwd.c	2022-12-18 12:18:04 UTC (rev 10411)
@@ -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\x82΁A\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\x82΁A\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: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2022-12-13 14:43:03 UTC (rev 10410)
+++ trunk/ttssh2/ttxssh/ssh.c	2022-12-18 12:18:04 UTC (rev 10411)
@@ -419,6 +419,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);
 	}


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