• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8924 (tree)
Time2020-08-24 19:53:55
Authoryoulab

Log Message

D&DによるSCP送信で、多数のファイルを一括送信するとエラーになる問題を修正した。
sshd_configのMaxSessions=10の場合、10個目の送信でエラーとなっていた。

Change Summary

Incremental Difference

--- branches/4-stable/doc/en/html/about/history.html (revision 8923)
+++ branches/4-stable/doc/en/html/about/history.html (revision 8924)
@@ -3281,6 +3281,7 @@
32813281 <!-- li>システムのメモリが不足している時、鍵交換時のホスト鍵による署名検証で不正な署名を正しい物として扱う可能性が有った問題を修正した。</li -->
32823282 <li>Resizing the VT window immediately after user authentication was completed, connection is closed by server.</li>
32833283 <!-- li>SSH認証ダイアログで一部のコントロールが常に有効になっていた</li -->
3284+ <li>When many files are sent in a batch by using D&D's SCP sending, an error occurs.</li>
32843285 </ul>
32853286 </li>
32863287
--- branches/4-stable/doc/ja/html/about/history.html (revision 8923)
+++ branches/4-stable/doc/ja/html/about/history.html (revision 8924)
@@ -3287,6 +3287,7 @@
32873287 <li>システムのメモリが不足している時、鍵交換時のホスト鍵による署名検証で不正な署名を正しい物として扱う可能性が有った問題を修正した。</li>
32883288 <li>ユーザ認証が完了した直後にVTウィンドウのサイズを変更すると、サーバから切断される問題を修正した。</li>
32893289 <li>SSH認証ダイアログで一部のコントロールが常に有効になっていた</li>
3290+ <li>D&DによるSCP送信で、多数のファイルを一括送信するとエラーになる問題を修正した。</li>
32903291 </ul>
32913292 </li>
32923293
--- branches/4-stable/teraterm/common/tttypes.h (revision 8923)
+++ branches/4-stable/teraterm/common/tttypes.h (revision 8924)
@@ -45,6 +45,7 @@
4545 #define IdPrnProcTimer 9
4646 #define IdCancelConnectTimer 10 // add (2007.1.10 yutaka)
4747 #define IdPasteDelayTimer 11
48+#define IdScpSendingTimer 12
4849
4950 /* Window Id */
5051 #define IdVT 1
--- branches/4-stable/teraterm/teraterm/vtwin.cpp (revision 8923)
+++ branches/4-stable/teraterm/teraterm/vtwin.cpp (revision 8924)
@@ -145,6 +145,11 @@
145145 #define WM_IME_COMPOSITION 0x010F
146146 #endif
147147
148+static BOOL SendScpDoing;
149+static TCHAR **DropListsSendScp;
150+static int DropListCountSendScp;
151+static int DropListsSendScpIndex;
152+
148153 /////////////////////////////////////////////////////////////////////////////
149154 // CVTWindow
150155
@@ -1977,7 +1982,9 @@
19771982 static bool SendScp(char *Filenames[], int FileCount, const char *SendDir)
19781983 {
19791984 typedef int (CALLBACK *PSSH_start_scp)(char *, char *);
1985+ typedef int (CALLBACK *PSSH_scp_sending_status)(void);
19801986 static PSSH_start_scp func = NULL;
1987+ static PSSH_scp_sending_status func_status = NULL;
19811988 static HMODULE h = NULL;
19821989 char msg[128];
19831990
@@ -1996,14 +2003,33 @@
19962003 goto scp_send_error;
19972004 }
19982005 }
2006+ if (func_status == NULL) {
2007+ func_status = (PSSH_scp_sending_status)GetProcAddress(h, "TTXScpSendingStatus");
2008+ if (func_status == NULL) {
2009+ _snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetProcAddress(\"TTXScpSendingStatus\")) %d", GetLastError());
2010+ goto scp_send_error;
2011+ }
2012+ }
19992013
2000- for (int i = 0; i < FileCount; i++) {
2001- const char *FileName = Filenames[i];
2002- func((char *)FileName, ts.ScpSendDir);
2014+ if (SendScpDoing) {
2015+ if (func_status()) {
2016+ return false;
2017+ } else {
2018+ DropListsSendScpIndex++;
2019+ }
20032020 }
2021+
2022+ func(Filenames[0], ts.ScpSendDir);
2023+
20042024 return true;
20052025 }
20062026
2027+static void StartSendScpTimer(void)
2028+{
2029+ DropListsSendScpIndex = 0;
2030+ SetTimer(HVTWin, IdScpSendingTimer, 100, NULL);
2031+}
2032+
20072033 void CVTWindow::DropListFree()
20082034 {
20092035 if (DropListCount > 0) {
@@ -2186,14 +2212,43 @@
21862212 }
21872213 case DROP_TYPE_SCP:
21882214 {
2189- // send by scp
2190- char **FileNames = &DropLists[i];
2191- int FileCount = DoSameProcess ? DropListCount - i : 1;
2192- if (!SendScp(FileNames, FileCount, ts.ScpSendDir)) {
2215+ // すでにSCP送信中なら何もしない。
2216+ if (SendScpDoing) {
2217+ // do nothing.
21932218 goto finish;
2219+
2220+ } else {
2221+ // 一括送信の場合はタイマー処理を行うことで、連続送信による
2222+ // エラーが起こらないようにする。
2223+ if (DoSameProcess) {
2224+ int j;
2225+
2226+ DropListCountSendScp = DropListCount - i;
2227+ DropListsSendScp = (char **)malloc(sizeof(char *) * DropListCountSendScp);
2228+
2229+ for (j = 0 ; j < DropListCountSendScp ; j++) {
2230+ DropListsSendScp[j] = _strdup(DropLists[j]);
2231+ }
2232+ SendScpDoing = TRUE;
2233+
2234+ StartSendScpTimer();
2235+ goto finish;
2236+
2237+ } else {
2238+ // send by scp
2239+ char **FileNames = &DropLists[i];
2240+ int FileCount = 1;
2241+ if (!SendScp(FileNames, FileCount, ts.ScpSendDir)) {
2242+ goto finish;
2243+ }
2244+ i += FileCount - 1;
2245+ break;
2246+
2247+ }
2248+
21942249 }
2195- i += FileCount - 1;
2196- break;
2250+
2251+
21972252 }
21982253 }
21992254 }
@@ -2921,7 +2976,34 @@
29212976 //::PostMessage(HVTWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
29222977 }
29232978 }
2979+ else if (nIDEvent == IdScpSendingTimer) {
2980+ char **FileNames;
2981+ int FileCount;
2982+ int j;
29242983
2984+ if (DropListsSendScpIndex >= DropListCountSendScp) {
2985+ ::KillTimer(HVTWin, IdScpSendingTimer);
2986+
2987+ for (j = 0 ; j < DropListCountSendScp; j++) {
2988+ free(DropListsSendScp[j]);
2989+ DropListsSendScp[j] = NULL;
2990+ }
2991+ free(DropListsSendScp);
2992+ DropListCountSendScp = 0;
2993+
2994+ SendScpDoing = FALSE;
2995+
2996+ } else {
2997+ FileNames = &DropListsSendScp[DropListsSendScpIndex];
2998+ FileCount = DropListCountSendScp;
2999+
3000+ SendScp(FileNames, FileCount, ts.ScpSendDir);
3001+
3002+ }
3003+
3004+ return;
3005+ }
3006+
29253007 ::KillTimer(HVTWin, nIDEvent);
29263008
29273009 switch (nIDEvent) {
--- branches/4-stable/ttssh2/ttxssh/ssh.c (revision 8923)
+++ branches/4-stable/ttssh2/ttxssh/ssh.c (revision 8924)
@@ -99,6 +99,8 @@
9999
100100 static CRITICAL_SECTION g_ssh_scp_lock; /* SCP受信用ロック */
101101
102+static int g_scp_sending; /* SCP送信中か? */
103+
102104 static void try_send_credentials(PTInstVar pvar);
103105 static void prep_compression(PTInstVar pvar);
104106
@@ -357,6 +359,8 @@
357359 // Windows9xで落ちる問題を修正した。
358360 if (c->scp.dir == FROMREMOTE)
359361 ssh2_scp_free_packetlist(c);
362+
363+ g_scp_sending = FALSE;
360364 }
361365 if (c->type == TYPE_AGENT) {
362366 buffer_free(c->agent_msg);
@@ -4220,6 +4224,8 @@
42204224 finish_send_packet(pvar);
42214225 buffer_free(msg);
42224226
4227+ g_scp_sending = TRUE;
4228+
42234229 logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_CHANNEL_OPEN was sent at SSH_scp_transaction().");
42244230
42254231 return TRUE;
@@ -4238,6 +4244,11 @@
42384244 return SSH_scp_transaction(pvar, sendfile, dstfile, TOREMOTE);
42394245 }
42404246
4247+int SSH_scp_sending_status(void)
4248+{
4249+ return g_scp_sending;
4250+}
4251+
42414252 int SSH_start_scp_receive(PTInstVar pvar, char *filename)
42424253 {
42434254 return SSH_scp_transaction(pvar, filename, NULL, FROMREMOTE);
--- branches/4-stable/ttssh2/ttxssh/ssh.h (revision 8923)
+++ branches/4-stable/ttssh2/ttxssh/ssh.h (revision 8924)
@@ -756,6 +756,7 @@
756756 char *originator, unsigned short originator_port);
757757
758758 int SSH_start_scp(PTInstVar pvar, char *sendfile, char *dstfile);
759+int SSH_scp_sending_status(void);
759760 int SSH_start_scp_receive(PTInstVar pvar, char *filename);
760761 int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction);
761762 int SSH_sftp_transaction(PTInstVar pvar);
--- branches/4-stable/ttssh2/ttxssh/ttxssh.c (revision 8923)
+++ branches/4-stable/ttssh2/ttxssh/ttxssh.c (revision 8924)
@@ -3953,6 +3953,11 @@
39533953 return SSH_start_scp(pvar, filename, dstfile);
39543954 }
39553955
3956+__declspec(dllexport) int CALLBACK TTXScpSendingStatus(void)
3957+{
3958+ return SSH_scp_sending_status();
3959+}
3960+
39563961 __declspec(dllexport) int CALLBACK TTXScpReceivefile(char *remotefile, char *localfile)
39573962 {
39583963 return SSH_scp_transaction(pvar, remotefile, localfile, FROMREMOTE);
Show on old repository browser