• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Tera Termの個人的な作業用リポジトリ


Commit MetaInfo

修订版cf3755e6ea7a142332bc877b4d0a6b9a16c2b37b (tree)
时间2023-10-08 15:24:34
作者zmatsuo <zmatsuo@user...>
Commiterzmatsuo

Log Message

文字列を返す関数の文字領域を動的確保するよう変更

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

MFT r10958

git-svn-id: svn+ssh://svn.osdn.net/svnroot/ttssh2/branches/4-stable@10963 f5f01b69-1e22-0410-acbf-894ab4bd6246

更改概述

差异

--- a/teraterm/common/ttlib.c
+++ b/teraterm/common/ttlib.c
@@ -38,6 +38,11 @@
3838 #include <ctype.h>
3939 #include <mbctype.h> // for _ismbblead
4040 #include <assert.h>
41+#if !defined(_CRTDBG_MAP_ALLOC)
42+#define _CRTDBG_MAP_ALLOC
43+#endif
44+#include <stdlib.h>
45+#include <crtdbg.h>
4146
4247 #include "teraterm_conf.h"
4348 #include "teraterm.h"
@@ -1525,13 +1530,25 @@ int KanjiCodeTranslate(int lang, int kcode)
15251530 return Table[lang][kcode];
15261531 }
15271532
1528-char *mctimelocal(char *format, BOOL utc_flag)
1533+/*
1534+ * 現在の時間を文字列にして返す
1535+ *
1536+ * @return 経過時刻文字列
1537+ * 不要になったらfree()すること
1538+ */
1539+char *mctimelocal(const char *format, BOOL utc_flag)
15291540 {
15301541 SYSTEMTIME systime;
1531- static char strtime[29];
1532- char week[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
1533- char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
1534- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
1542+ const size_t sizeof_strtime = 29;
1543+ char *strtime = malloc(sizeof_strtime);
1544+ *strtime = '\0';
1545+ static const char week[][4] = {
1546+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
1547+ };
1548+ static const char month[][4] = {
1549+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1550+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
1551+ };
15351552 char tmp[5];
15361553 unsigned int i = strlen(format);
15371554
@@ -1541,88 +1558,94 @@ char *mctimelocal(char *format, BOOL utc_flag)
15411558 else {
15421559 GetLocalTime(&systime);
15431560 }
1544- memset(strtime, 0, sizeof(strtime));
15451561 for (i=0; i<strlen(format); i++) {
15461562 if (format[i] == '%') {
15471563 char c = format[i + 1];
15481564 switch (c) {
15491565 case 'a':
15501566 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%s", week[systime.wDayOfWeek]);
1551- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1567+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15521568 i++;
15531569 break;
15541570 case 'b':
15551571 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%s", month[systime.wMonth - 1]);
1556- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1572+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15571573 i++;
15581574 break;
15591575 case 'd':
15601576 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wDay);
1561- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1577+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15621578 i++;
15631579 break;
15641580 case 'e':
15651581 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%2d", systime.wDay);
1566- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1582+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15671583 i++;
15681584 break;
15691585 case 'H':
15701586 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wHour);
1571- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1587+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15721588 i++;
15731589 break;
15741590 case 'N':
15751591 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%03d", systime.wMilliseconds);
1576- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1592+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15771593 i++;
15781594 break;
15791595 case 'm':
15801596 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wMonth);
1581- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1597+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15821598 i++;
15831599 break;
15841600 case 'M':
15851601 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wMinute);
1586- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1602+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15871603 i++;
15881604 break;
15891605 case 'S':
15901606 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02d", systime.wSecond);
1591- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1607+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15921608 i++;
15931609 break;
15941610 case 'w':
15951611 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%d", systime.wDayOfWeek);
1596- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1612+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
15971613 i++;
15981614 break;
15991615 case 'Y':
16001616 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%04d", systime.wYear);
1601- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1617+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
16021618 i++;
16031619 break;
16041620 case '%':
1605- strncat_s(strtime, sizeof(strtime), "%", _TRUNCATE);
1621+ strncat_s(strtime, sizeof_strtime, "%", _TRUNCATE);
16061622 i++;
16071623 break;
16081624 default:
16091625 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", format[i]);
1610- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1626+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
16111627 break;
16121628 }
16131629 }
16141630 else {
16151631 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", format[i]);
1616- strncat_s(strtime, sizeof(strtime), tmp, _TRUNCATE);
1632+ strncat_s(strtime, sizeof_strtime, tmp, _TRUNCATE);
16171633 }
16181634 }
16191635
16201636 return strtime;
16211637 }
16221638
1639+/*
1640+ * 現在までの経過時間を文字列にして返す
1641+ *
1642+ * @return 経過時間の文字列
1643+ * 不要になったらfree()すること
1644+ */
16231645 char *strelapsed(DWORD start_time)
16241646 {
1625- static char strtime[20];
1647+ size_t sizeof_strtime = 20;
1648+ char *strtime = malloc(sizeof_strtime);
16261649 int days, hours, minutes, seconds, msecs;
16271650 DWORD delta = GetTickCount() - start_time;
16281651
@@ -1638,7 +1661,7 @@ char *strelapsed(DWORD start_time)
16381661 hours = delta % 24;
16391662 days = delta / 24;
16401663
1641- _snprintf_s(strtime, sizeof(strtime), _TRUNCATE,
1664+ _snprintf_s(strtime, sizeof_strtime, _TRUNCATE,
16421665 "%d %02d:%02d:%02d.%03d",
16431666 days, hours, minutes, seconds, msecs);
16441667
--- a/teraterm/common/ttlib.h
+++ b/teraterm/common/ttlib.h
@@ -102,7 +102,7 @@ DllExport BOOL HasBalloonTipSupport();
102102 int KanjiCode2List(int lang, int kcode);
103103 int List2KanjiCode(int lang, int kcode);
104104 int KanjiCodeTranslate(int lang, int kcode);
105-DllExport char *mctimelocal(char *format, BOOL utc_flag);
105+DllExport char *mctimelocal(const char *format, BOOL utc_flag);
106106 char *strelapsed(DWORD start_time);
107107
108108 void b64encode(PCHAR dst, int dsize, PCHAR src, int len);
--- a/teraterm/teraterm/filesys.cpp
+++ b/teraterm/teraterm/filesys.cpp
@@ -1015,6 +1015,7 @@ void LogToFile()
10151015 strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
10161016 strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
10171017 strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
1018+ free(strtime);
10181019 }
10191020
10201021 /* 2007.05.24 Gentaro */
--- a/ttssh2/ttxssh/ttxssh.c
+++ b/ttssh2/ttxssh/ttxssh.c
@@ -831,6 +831,7 @@ void logputs(int level, char *msg)
831831 _write(file, msg, strlen(msg));
832832 _write(file, "\n", 1);
833833 _close(file);
834+ free(strtime);
834835 }
835836 }
836837 }