Revision: 10963 https://osdn.net/projects/ttssh2/scm/svn/commits/10963 Author: zmatsuo Date: 2023-10-08 15:24:34 +0900 (Sun, 08 Oct 2023) Log Message: ----------- 文字列を返す関数の文字領域を動的確保するよう変更 - 複数スレッドを使用している箇所でログが壊れたり不正な処理で終了することがあった - ログ出力時に使用していた関数が文字領域を静的に持っていた - マルチスレッドで使用していると文字領域を破壊することがある - 返す文字領域を動的にして不要になったらfree()するよう仕様を変更 MFT r10958 Revision Links: -------------- https://osdn.net/projects/ttssh2/scm/svn/commits/10958 Modified Paths: -------------- branches/4-stable/teraterm/common/ttlib.c branches/4-stable/teraterm/common/ttlib.h branches/4-stable/teraterm/teraterm/filesys.cpp branches/4-stable/ttssh2/ttxssh/ttxssh.c -------------- next part -------------- Modified: branches/4-stable/teraterm/common/ttlib.c =================================================================== --- branches/4-stable/teraterm/common/ttlib.c 2023-10-08 06:17:15 UTC (rev 10962) +++ branches/4-stable/teraterm/common/ttlib.c 2023-10-08 06:24:34 UTC (rev 10963) @@ -38,6 +38,11 @@ #include <ctype.h> #include <mbctype.h> // for _ismbblead #include <assert.h> +#if !defined(_CRTDBG_MAP_ALLOC) +#define _CRTDBG_MAP_ALLOC +#endif +#include <stdlib.h> +#include <crtdbg.h> #include "teraterm_conf.h" #include "teraterm.h" @@ -1525,13 +1530,25 @@ return Table[lang][kcode]; } -char *mctimelocal(char *format, BOOL utc_flag) +/* + * \x8C\xBB\x8D݂̎\x9E\x8AԂ\x9A\x97\xF1\x82ɂ\xB5\x82ĕԂ\xB7 + * + * @return \x8Co\x89ߎ\x9E\x8D\x8F\x95\xB6\x8E\x9A\x97\xF1 + * \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6 + */ +char *mctimelocal(const char *format, BOOL utc_flag) { SYSTEMTIME systime; - static char strtime[29]; - char week[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; - char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + const size_t sizeof_strtime = 29; + char *strtime = malloc(sizeof_strtime); + *strtime = '\0'; + static const char week[][4] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; + static const char month[][4] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; char tmp[5]; unsigned int i = strlen(format); @@ -1541,7 +1558,6 @@ else { GetLocalTime(&systime); } - memset(strtime, 0, sizeof(strtime)); for (i=0; i<strlen(format); i++) { if (format[i] == '%') { char c = format[i + 1]; @@ -1548,72 +1564,72 @@ switch (c) { case 'a': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%s", week[systime.wDayOfWeek]); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'b': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%s", month[systime.wMonth - 1]); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'd': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wDay); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'e': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%2d", systime.wDay); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'H': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wHour); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'N': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%03d", systime.wMilliseconds); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'm': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wMonth); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'M': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wMinute); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'S': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wSecond); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'w': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%d", systime.wDayOfWeek); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case 'Y': _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%04d", systime.wYear); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); i++; break; case '%': - strncat_s(strtime, sizeof(strtime), "%", _TRUNCATE); + strncat_s(strtime, sizeof_strtime, "%", _TRUNCATE); i++; break; default: _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", format[i]); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); break; } } else { _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", format[i]); - strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE); + strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE); } } @@ -1620,9 +1636,16 @@ return strtime; } +/* + * \x8C\xBB\x8D݂܂ł̌o\x89ߎ\x9E\x8AԂ\x9A\x97\xF1\x82ɂ\xB5\x82ĕԂ\xB7 + * + * @return \x8Co\x89ߎ\x9E\x8AԂ̕\xB6\x8E\x9A\x97\xF1 + * \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6 + */ char *strelapsed(DWORD start_time) { - static char strtime[20]; + size_t sizeof_strtime = 20; + char *strtime = malloc(sizeof_strtime); int days, hours, minutes, seconds, msecs; DWORD delta = GetTickCount() - start_time; @@ -1638,7 +1661,7 @@ hours = delta % 24; days = delta / 24; - _snprintf_s(strtime, sizeof(strtime), _TRUNCATE, + _snprintf_s(strtime, sizeof_strtime, _TRUNCATE, "%d %02d:%02d:%02d.%03d", days, hours, minutes, seconds, msecs); Modified: branches/4-stable/teraterm/common/ttlib.h =================================================================== --- branches/4-stable/teraterm/common/ttlib.h 2023-10-08 06:17:15 UTC (rev 10962) +++ branches/4-stable/teraterm/common/ttlib.h 2023-10-08 06:24:34 UTC (rev 10963) @@ -102,7 +102,7 @@ int KanjiCode2List(int lang, int kcode); int List2KanjiCode(int lang, int kcode); int KanjiCodeTranslate(int lang, int kcode); -DllExport char *mctimelocal(char *format, BOOL utc_flag); +DllExport char *mctimelocal(const char *format, BOOL utc_flag); char *strelapsed(DWORD start_time); void b64encode(PCHAR dst, int dsize, PCHAR src, int len); Modified: branches/4-stable/teraterm/teraterm/filesys.cpp =================================================================== --- branches/4-stable/teraterm/teraterm/filesys.cpp 2023-10-08 06:17:15 UTC (rev 10962) +++ branches/4-stable/teraterm/teraterm/filesys.cpp 2023-10-08 06:24:34 UTC (rev 10963) @@ -1015,6 +1015,7 @@ strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE); strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE); strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE); + free(strtime); } /* 2007.05.24 Gentaro */ Modified: branches/4-stable/ttssh2/ttxssh/ttxssh.c =================================================================== --- branches/4-stable/ttssh2/ttxssh/ttxssh.c 2023-10-08 06:17:15 UTC (rev 10962) +++ branches/4-stable/ttssh2/ttxssh/ttxssh.c 2023-10-08 06:24:34 UTC (rev 10963) @@ -831,6 +831,7 @@ _write(file, msg, strlen(msg)); _write(file, "\n", 1); _close(file); + free(strtime); } } }