[ttssh2-commit] [10958] 文字列を返す関数の文字領域を動的確保するよう変更

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 10月 8日 (日) 02:40:16 JST


Revision: 10958
          https://osdn.net/projects/ttssh2/scm/svn/commits/10958
Author:   zmatsuo
Date:     2023-10-08 02:40:16 +0900 (Sun, 08 Oct 2023)
Log Message:
-----------
文字列を返す関数の文字領域を動的確保するよう変更

- 複数スレッドを使用している箇所でログが壊れたり不正な処理で終了することがあった
- ログ出力時に使用していた関数が文字領域を静的に持っていた
- マルチスレッドで使用していると文字領域を破壊することがある
- 返す文字領域を動的にして不要になったらfree()するよう仕様を変更

Modified Paths:
--------------
    trunk/teraterm/common/ttlib.c
    trunk/teraterm/common/ttlib.h
    trunk/teraterm/teraterm/filesys_log.cpp
    trunk/ttssh2/ttxssh/ttxssh.c

-------------- next part --------------
Modified: trunk/teraterm/common/ttlib.c
===================================================================
--- trunk/teraterm/common/ttlib.c	2023-10-04 23:35:39 UTC (rev 10957)
+++ trunk/teraterm/common/ttlib.c	2023-10-07 17:40:16 UTC (rev 10958)
@@ -37,6 +37,11 @@
 #include <shlobj.h>
 #include <ctype.h>
 #include <assert.h>
+#if !defined(_CRTDBG_MAP_ALLOC)
+#define _CRTDBG_MAP_ALLOC
+#endif
+#include <stdlib.h>
+#include <crtdbg.h>
 
 #include "teraterm.h"
 #include "tttypes.h"
@@ -883,13 +888,25 @@
 	return CDSIZEOF_STRUCT(OPENFILENAMEW,lpTemplateName);
 }
 
-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);
 
@@ -899,7 +916,6 @@
 	else {
 		GetLocalTime(&systime);
 	}
-	memset(strtime, 0, sizeof(strtime));
 	for (i=0; i<strlen(format); i++) {
 		if (format[i] == '%') {
 			char c = format[i + 1];
@@ -906,72 +922,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);
 		}
 	}
 
@@ -978,9 +994,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;
 
@@ -996,7 +1019,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: trunk/teraterm/common/ttlib.h
===================================================================
--- trunk/teraterm/common/ttlib.h	2023-10-04 23:35:39 UTC (rev 10957)
+++ trunk/teraterm/common/ttlib.h	2023-10-07 17:40:16 UTC (rev 10958)
@@ -142,7 +142,7 @@
 DllExport BOOL HasDnsQuery();
 DllExport BOOL HasBalloonTipSupport();
 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: trunk/teraterm/teraterm/filesys_log.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys_log.cpp	2023-10-04 23:35:39 UTC (rev 10957)
+++ trunk/teraterm/teraterm/filesys_log.cpp	2023-10-07 17:40:16 UTC (rev 10958)
@@ -615,6 +615,7 @@
 	strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
 	strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
 	strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
+	free(strtime);
 
 	return ToWcharA(tmp);
 }

Modified: trunk/ttssh2/ttxssh/ttxssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.c	2023-10-04 23:35:39 UTC (rev 10957)
+++ trunk/ttssh2/ttxssh/ttxssh.c	2023-10-07 17:40:16 UTC (rev 10958)
@@ -819,6 +819,7 @@
 		strtime = mctimelocal("%Y-%m-%d %H:%M:%S.%NZ", TRUE);
 		len = asprintf(&buf, "%s [%lu] %s\n",
 					   strtime, GetCurrentProcessId(), msg);
+		free(strtime);
 
 		if (enable_log) {
 			wchar_t *fname = get_log_dir_relative_nameW(L"TTSSH.LOG");


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