Tera Termの個人的な作業用リポジトリ
修订版 | cf3755e6ea7a142332bc877b4d0a6b9a16c2b37b (tree) |
---|---|
时间 | 2023-10-08 15:24:34 |
作者 | zmatsuo <zmatsuo@user...> |
Commiter | zmatsuo |
文字列を返す関数の文字領域を動的確保するよう変更
- 複数スレッドを使用している箇所でログが壊れたり不正な処理で終了することがあった
- ログ出力時に使用していた関数が文字領域を静的に持っていた
- マルチスレッドで使用していると文字領域を破壊することがある
- 返す文字領域を動的にして不要になったらfree()するよう仕様を変更
MFT r10958
git-svn-id: svn+ssh://svn.osdn.net/svnroot/ttssh2/branches/4-stable@10963 f5f01b69-1e22-0410-acbf-894ab4bd6246
@@ -38,6 +38,11 @@ | ||
38 | 38 | #include <ctype.h> |
39 | 39 | #include <mbctype.h> // for _ismbblead |
40 | 40 | #include <assert.h> |
41 | +#if !defined(_CRTDBG_MAP_ALLOC) | |
42 | +#define _CRTDBG_MAP_ALLOC | |
43 | +#endif | |
44 | +#include <stdlib.h> | |
45 | +#include <crtdbg.h> | |
41 | 46 | |
42 | 47 | #include "teraterm_conf.h" |
43 | 48 | #include "teraterm.h" |
@@ -1525,13 +1530,25 @@ int KanjiCodeTranslate(int lang, int kcode) | ||
1525 | 1530 | return Table[lang][kcode]; |
1526 | 1531 | } |
1527 | 1532 | |
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) | |
1529 | 1540 | { |
1530 | 1541 | 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 | + }; | |
1535 | 1552 | char tmp[5]; |
1536 | 1553 | unsigned int i = strlen(format); |
1537 | 1554 |
@@ -1541,88 +1558,94 @@ char *mctimelocal(char *format, BOOL utc_flag) | ||
1541 | 1558 | else { |
1542 | 1559 | GetLocalTime(&systime); |
1543 | 1560 | } |
1544 | - memset(strtime, 0, sizeof(strtime)); | |
1545 | 1561 | for (i=0; i<strlen(format); i++) { |
1546 | 1562 | if (format[i] == '%') { |
1547 | 1563 | char c = format[i + 1]; |
1548 | 1564 | switch (c) { |
1549 | 1565 | case 'a': |
1550 | 1566 | _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); | |
1552 | 1568 | i++; |
1553 | 1569 | break; |
1554 | 1570 | case 'b': |
1555 | 1571 | _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); | |
1557 | 1573 | i++; |
1558 | 1574 | break; |
1559 | 1575 | case 'd': |
1560 | 1576 | _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); | |
1562 | 1578 | i++; |
1563 | 1579 | break; |
1564 | 1580 | case 'e': |
1565 | 1581 | _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); | |
1567 | 1583 | i++; |
1568 | 1584 | break; |
1569 | 1585 | case 'H': |
1570 | 1586 | _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); | |
1572 | 1588 | i++; |
1573 | 1589 | break; |
1574 | 1590 | case 'N': |
1575 | 1591 | _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); | |
1577 | 1593 | i++; |
1578 | 1594 | break; |
1579 | 1595 | case 'm': |
1580 | 1596 | _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); | |
1582 | 1598 | i++; |
1583 | 1599 | break; |
1584 | 1600 | case 'M': |
1585 | 1601 | _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); | |
1587 | 1603 | i++; |
1588 | 1604 | break; |
1589 | 1605 | case 'S': |
1590 | 1606 | _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); | |
1592 | 1608 | i++; |
1593 | 1609 | break; |
1594 | 1610 | case 'w': |
1595 | 1611 | _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); | |
1597 | 1613 | i++; |
1598 | 1614 | break; |
1599 | 1615 | case 'Y': |
1600 | 1616 | _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); | |
1602 | 1618 | i++; |
1603 | 1619 | break; |
1604 | 1620 | case '%': |
1605 | - strncat_s(strtime, sizeof(strtime), "%", _TRUNCATE); | |
1621 | + strncat_s(strtime, sizeof_strtime, "%", _TRUNCATE); | |
1606 | 1622 | i++; |
1607 | 1623 | break; |
1608 | 1624 | default: |
1609 | 1625 | _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); | |
1611 | 1627 | break; |
1612 | 1628 | } |
1613 | 1629 | } |
1614 | 1630 | else { |
1615 | 1631 | _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); | |
1617 | 1633 | } |
1618 | 1634 | } |
1619 | 1635 | |
1620 | 1636 | return strtime; |
1621 | 1637 | } |
1622 | 1638 | |
1639 | +/* | |
1640 | + * 現在までの経過時間を文字列にして返す | |
1641 | + * | |
1642 | + * @return 経過時間の文字列 | |
1643 | + * 不要になったらfree()すること | |
1644 | + */ | |
1623 | 1645 | char *strelapsed(DWORD start_time) |
1624 | 1646 | { |
1625 | - static char strtime[20]; | |
1647 | + size_t sizeof_strtime = 20; | |
1648 | + char *strtime = malloc(sizeof_strtime); | |
1626 | 1649 | int days, hours, minutes, seconds, msecs; |
1627 | 1650 | DWORD delta = GetTickCount() - start_time; |
1628 | 1651 |
@@ -1638,7 +1661,7 @@ char *strelapsed(DWORD start_time) | ||
1638 | 1661 | hours = delta % 24; |
1639 | 1662 | days = delta / 24; |
1640 | 1663 | |
1641 | - _snprintf_s(strtime, sizeof(strtime), _TRUNCATE, | |
1664 | + _snprintf_s(strtime, sizeof_strtime, _TRUNCATE, | |
1642 | 1665 | "%d %02d:%02d:%02d.%03d", |
1643 | 1666 | days, hours, minutes, seconds, msecs); |
1644 | 1667 |
@@ -102,7 +102,7 @@ DllExport BOOL HasBalloonTipSupport(); | ||
102 | 102 | int KanjiCode2List(int lang, int kcode); |
103 | 103 | int List2KanjiCode(int lang, int kcode); |
104 | 104 | 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); | |
106 | 106 | char *strelapsed(DWORD start_time); |
107 | 107 | |
108 | 108 | void b64encode(PCHAR dst, int dsize, PCHAR src, int len); |
@@ -1015,6 +1015,7 @@ void LogToFile() | ||
1015 | 1015 | strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE); |
1016 | 1016 | strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE); |
1017 | 1017 | strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE); |
1018 | + free(strtime); | |
1018 | 1019 | } |
1019 | 1020 | |
1020 | 1021 | /* 2007.05.24 Gentaro */ |
@@ -831,6 +831,7 @@ void logputs(int level, char *msg) | ||
831 | 831 | _write(file, msg, strlen(msg)); |
832 | 832 | _write(file, "\n", 1); |
833 | 833 | _close(file); |
834 | + free(strtime); | |
834 | 835 | } |
835 | 836 | } |
836 | 837 | } |