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\x91p\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;