[ttssh2-commit] [10342] コマンドライン引数の文字長上限を一部なくした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2022年 10月 31日 (月) 00:08:56 JST


Revision: 10342
          https://osdn.net/projects/ttssh2/scm/svn/commits/10342
Author:   zmatsuo
Date:     2022-10-31 00:08:55 +0900 (Mon, 31 Oct 2022)
Log Message:
-----------
コマンドライン引数の文字長上限を一部なくした

- まだ上限は存在
  - コマンドライン引数をトークンに分離する箇所(GetParam())など
- スイッチパース時ファイル名,フォルダ名長の上限をなくした
  - /F, /K, /M, /R, /FD
    - 各スイッチのファイル名,パスの切り出しの上限をなくした
- パス区切り '/' を受け付けるようになった
  - フルパスファイル名、パスの正規化に GetFullPathNameW() を使用するようにした
    - '/' は '\' に変換される
  - 従来でも概ね動作していたが '/' が使えない API でエラーが出ることがあった
    - GetSaveFileNameW() など

Modified Paths:
--------------
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/ttpset/ttset.c

-------------- next part --------------
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2022-10-29 12:09:58 UTC (rev 10341)
+++ trunk/teraterm/teraterm/vtwin.cpp	2022-10-30 15:08:55 UTC (rev 10342)
@@ -291,6 +291,9 @@
 	// 256\x83o\x83C\x83g\x88ȏ\xE3\x82̃R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x83p\x83\x89\x83\x81\x81[\x83^\x8Ew\x92肪\x82\xA0\x82\xE9\x82ƁABOF(Buffer Over Flow)\x82\xC5
 	// \x97\x8E\x82\xBF\x82\xE9\x83o\x83O\x82\xF0\x8FC\x90\xB3\x81B(2007.6.12 maya)
 	if (LoadTTSET()) {
+		// GetCommandLineW() in MSDN remark
+		//  The lifetime of the returned value is managed by the
+		//  system, applications should not free or modify this value.
 		wchar_t *ParamW = GetCommandLineW();
 		(*ParseParam)(ParamW, &ts, &(TopicName[0]));
 	}
@@ -3565,11 +3568,10 @@
 			ts.ComPort = GetHNRec.ComPort;
 
 			if ((GetHNRec.PortType==IdTCPIP) && LoadTTSET()) {
-				wchar_t command[MAXPATHLEN + HostNameMaxLength];
-				wcsncpy_s(command, _countof(command), ttermpro, _TRUNCATE);
-				wcsncat_s(command, _countof(command), L" ", _TRUNCATE);
-				wcsncat_s(command, _countof(command), hostname, _TRUNCATE);
+				wchar_t *command = NULL;
+				awcscats(&command, ttermpro, L" ", hostname, NULL);
 				(*ParseParam)(command, &ts, NULL);
+				free(command);
 				FreeTTSET();
 			}
 			SetKeyMap();

Modified: trunk/teraterm/ttpset/ttset.c
===================================================================
--- trunk/teraterm/ttpset/ttset.c	2022-10-29 12:09:58 UTC (rev 10341)
+++ trunk/teraterm/ttpset/ttset.c	2022-10-30 15:08:55 UTC (rev 10342)
@@ -41,6 +41,7 @@
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>
 #include <crtdbg.h>
+#include <assert.h>
 
 #include "ttlib.h"
 #include "tt_res.h"
@@ -3495,12 +3496,60 @@
 	}
 }
 
+/**
+ *	\x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xA9\x82\xE7\x83t\x83\x8B\x83p\x83X\x82\xF0\x8D쐬\x82\xB7\x82\xE9
+ *
+ *	@param[in]	command_line	\x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x82̕\xB6\x8E\x9A\x97\xF1(\x83t\x83@\x83C\x83\x8B\x96\xBC)
+ *	@param[in]	default_path	\x83t\x83@\x83C\x83\x8B\x82̑\xB6\x8D݂\xB7\x82\xE9\x83p\x83X(\x83f\x83t\x83H\x83\x8B\x83g\x83p\x83X)
+ *								\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\x8A\x91΃p\x83X\x82̎\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x82̑O\x82ɒlj\xC1\x82\xB3\x82\xEA\x82\xE9
+ *								NULL\x82̂Ƃ\xAB\x81A\x83J\x83\x8C\x83\x93\x83g\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xAA\x92lj\xC1\x82\xB3\x82\xEA\x82\xE9
+ *	@param[in]	default_ini		\x83t\x83@\x83C\x83\x8B\x82Ɋg\x92\xA3\x8Eq\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2\x8Fꍇ\x92lj\xC1\x82\xB3\x82\xEA\x82\xE9
+ *								L".ini"\x93\x99
+ *								NULL\x82̂Ƃ\xAB\x92lj\xC1\x82\xB5\x82Ȃ\xA2
+ *	@return		\x83t\x83\x8B\x83p\x83X\x83t\x83@\x83C\x83\x8B\x96\xBC
+ */
+static wchar_t *GetFilePath(const wchar_t *command_line, const wchar_t *default_path, const wchar_t *default_ini)
+{
+	wchar_t *full_path;
+	wchar_t *filepart;
+	wchar_t *tmp;
+	if (command_line == NULL || *command_line == 0) {
+		// \x93\xFC\x97͂\xAA\x82\xA8\x82\xA9\x82\xB5\x82\xA2
+		return NULL;
+	}
+	if (IsRelativePathW(command_line) && default_path != NULL) {
+		full_path = NULL;
+		awcscats(&full_path, default_path, L"\\", command_line, NULL);
+	}
+	else {
+		full_path = _wcsdup(command_line);
+	}
 
+	// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82̃t\x83\x8B\x83p\x83X\x89\xBB(\x90\xB3\x8BK\x89\xBB)
+	hGetFullPathNameW(full_path, &tmp, &filepart);
+	free(full_path);
+	full_path = tmp;
+	if (filepart == NULL) {
+		// \x83t\x83@\x83C\x83\x8B\x95\x94\x95\xAA\x82\xAA\x82Ȃ\xA2?
+		assert(FALSE);
+		free(full_path);
+		return _wcsdup(command_line);
+	}
+
+	// \x8Ag\x92\xA3\x8Eq\x82̒lj\xC1
+	if (default_ini != NULL) {
+		if (wcsrchr(filepart, L'.') == NULL) {
+			awcscat(&full_path, default_ini);
+		}
+	}
+
+	return full_path;
+}
+
 void PASCAL _ParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic)
 {
 	int pos, c;
 	wchar_t Temp[MaxStrLen]; // ttpmacro\x82\xA9\x82\xE7\x8CĂ΂\xEA\x82邱\x82Ƃ\xF0\x91z\x92肵MaxStrLen\x83T\x83C\x83Y\x82Ƃ\xB7\x82\xE9
-	wchar_t Temp2[MaxStrLen];
 	WORD ParamPort = 0;
 	WORD ParamCom = 0;
 	WORD ParamTCP = 0;
@@ -3528,19 +3577,15 @@
 	start = GetParam(Temp, _countof(Temp), Param);
 
 	cur = start;
-	while (next = GetParam(Temp, _countof(Temp), cur)) {
+	while ((next = GetParam(Temp, _countof(Temp), cur))) {
 		DequoteParam(Temp, _countof(Temp), Temp);
 		if (_wcsnicmp(Temp, L"/F=", 3) == 0) {	/* setup filename */
-			wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
-			if (Temp2[0] != 0) {
-				ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".INI", Temp,
-						   _countof(Temp));
-				if (_wcsicmp(ts->SetupFNameW, Temp) != 0) {
-					free(ts->SetupFNameW);
-					ts->SetupFNameW = _wcsdup(Temp);
-					WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
-					_ReadIniFile(ts->SetupFNameW, ts);
-				}
+			wchar_t *f = GetFilePath(&Temp[3], ts->HomeDirW, L".INI");
+			if (f != NULL && _wcsicmp(ts->SetupFNameW, f) != 0) {
+				free(ts->SetupFNameW);
+				ts->SetupFNameW = f;
+				WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
+				_ReadIniFile(ts->SetupFNameW, ts);
 			}
 		}
 		cur = next;
@@ -3547,7 +3592,7 @@
 	}
 
 	cur = start;
-	while (next = GetParam(Temp, _countof(Temp), cur)) {
+	while ((next = GetParam(Temp, _countof(Temp), cur))) {
 		DequoteParam(Temp, _countof(Temp), Temp);
 
 		if (HostNameFlag) {
@@ -3633,15 +3678,14 @@
 			ts->HostDialogOnStartup = TRUE;
 		}
 		else if (_wcsnicmp(Temp, L"/FD=", 4) == 0) {	/* file transfer directory */
-			wcsncpy_s(Temp2, _countof(Temp2), &Temp[4], _TRUNCATE);
-			if (wcslen(Temp2) > 0) {
-				wchar_t *dir = Temp2;
-				if (DoesFolderExistW(dir)) {
-					free(ts->FileDirW);
-					ts->FileDirW = _wcsdup(dir);
-					WideCharToACP_t(ts->FileDirW, ts->FileDir, sizeof(ts->FileDir));
-				}
+			wchar_t *dir;
+			hGetFullPathNameW(&Temp[4], &dir, NULL);
+			if (dir != NULL && wcslen(dir) > 0 && DoesFolderExistW(dir)) {
+				free(ts->FileDirW);
+				ts->FileDirW = _wcsdup(dir);
+				WideCharToACP_t(ts->FileDirW, ts->FileDir, sizeof(ts->FileDir));
 			}
+			free(dir);
 		}
 		else if (_wcsicmp(Temp, L"/H") == 0)	/* hide title bar */
 			ts->HideTitle = 1;
@@ -3648,10 +3692,11 @@
 		else if (_wcsicmp(Temp, L"/I") == 0)	/* iconize */
 			ts->Minimize = 1;
 		else if (_wcsnicmp(Temp, L"/K=", 3) == 0) {	/* Keyboard setup file */
-			wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
-			ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".CNF", Temp, _countof(Temp));
-			ts->KeyCnfFNW = _wcsdup(Temp);
-			WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
+			wchar_t *f = GetFilePath(&Temp[3], ts->HomeDirW, L".CNF");
+			if (f != NULL) {
+				ts->KeyCnfFNW = f;
+				WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
+			}
 		}
 		else if ((_wcsnicmp(Temp, L"/KR=", 4) == 0) ||
 		         (_wcsnicmp(Temp, L"/KT=", 4) == 0)) {	/* kanji code */
@@ -3681,8 +3726,11 @@
 			}
 		}
 		else if (_wcsnicmp(Temp, L"/L=", 3) == 0) {	/* log file */
-			ts->LogFNW = _wcsdup(&Temp[3]);
-			WideCharToACP_t(ts->LogFNW, ts->LogFN, _countof(ts->LogFN));
+			wchar_t *f = GetFilePath(&Temp[3], ts->LogDefaultPathW, NULL);
+			if (f != NULL) {
+				ts->LogFNW = f;
+				WideCharToACP_t(ts->LogFNW, ts->LogFN, _countof(ts->LogFN));
+			}
 		}
 		else if (_wcsnicmp(Temp, L"/LA=", 4) == 0) {	/* language */
 			switch (Temp[4]) {
@@ -3710,9 +3758,7 @@
 			if ((Temp[3] == 0) || (Temp[3] == '*')) {
 				ts->MacroFNW = _wcsdup(L"*");
 			} else {
-				wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
-				ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".TTL", Temp, _countof(Temp));
-				ts->MacroFNW = _wcsdup(Temp);
+				ts->MacroFNW = GetFilePath(&Temp[3], ts->HomeDirW, L".TTL");
 			}
 			WideCharToACP_t(ts->MacroFNW, ts->MacroFN, _countof(ts->MacroFN));
 			/* Disable auto connect to serial when macro mode (2006.9.15 maya) */
@@ -3748,11 +3794,12 @@
 			ParamPort = IdNamedPipe;
 		}
 		else if (_wcsnicmp(Temp, L"/R=", 3) == 0) {	/* Replay filename */
-			wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
-			ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L"", Temp, _countof(Temp));
-			WideCharToACP_t(Temp, ts->HostName, _countof(ts->HostName));
-			if (strlen(ts->HostName) > 0)
-				ParamPort = IdFile;
+			wchar_t *f = GetFilePath(&Temp[3], ts->HomeDirW, NULL);
+			if (f != NULL) {
+				WideCharToACP_t(f, ts->HostName, _countof(ts->HostName));
+				if (strlen(ts->HostName) > 0)
+					ParamPort = IdFile;
+			}
 		}
 		else if (_wcsicmp(Temp, L"/T=0") == 0) {	/* telnet disable */
 			ParamPort = IdTCPIP;


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