• R/O
  • SSH
  • HTTPS

ttssh2: コミット


コミットメタ情報

リビジョン9915 (tree)
日時2022-05-12 22:55:27
作者zmatsuo

ログメッセージ

セッションの複製後、「ディレクトリを変更」で落ちる

- セッションの複製時に構造体のコピーができていなかった

- TTTSet (strcut tttset)

- 最近追加したパスやファイル名のコピーをケアしていなかった

Ticket #44553

変更サマリ

差分

--- trunk/teraterm/common/tttypes.h (revision 9914)
+++ trunk/teraterm/common/tttypes.h (revision 9915)
@@ -347,7 +347,13 @@
347347 char reserve[20];
348348 } cygterm_t;
349349
350-/* TTTSet */
350+/**
351+ * TTTSet
352+ * セッションの複製時
353+ * この構造体は複製先にコピーされる
354+ * path等、動的に確保した部分のコピーは
355+ * ../ttcmn_dup.cpp を参照
356+ */
351357 struct tttset {
352358 /*------ VTSet --------*/
353359 /* Tera Term home directory */
--- trunk/teraterm/ttpcmn/ttcmn_dup.cpp (revision 9914)
+++ trunk/teraterm/ttpcmn/ttcmn_dup.cpp (revision 9915)
@@ -27,11 +27,12 @@
2727 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828 */
2929
30-#include <direct.h>
3130 #include <string.h>
3231 #include <stdio.h>
3332 #include <windows.h>
3433 #include <assert.h>
34+#define _CRTDBG_MAP_ALLOC
35+#include <stdlib.h>
3536 #include <crtdbg.h>
3637 #include <wchar.h>
3738 #if (defined(_MSC_VER) && (_MSC_VER >= 1600)) || !defined(_MSC_VER)
@@ -61,7 +62,7 @@
6162 size_t offset; // 先頭からのオフセット
6263 enum {
6364 COPY = 0, // データをコピーする
64- MALLOCED_WSTRING = 1, // mallocした領域の
65+ MALLOCED_WSTRING = 1, // mallocした領域の wchar_t 文字列
6566 } type;
6667 } TSerializeInfo;
6768
@@ -88,7 +89,12 @@
8889 const size_t l = info->size;
8990 unsigned char *d;
9091 const unsigned char *s = (unsigned char *)src + info->offset;
91- blob = (uint8_t *)realloc(blob, size + l);
92+ uint8_t *p = (uint8_t*)realloc(blob, size + l);
93+ if (p == NULL) {
94+ free(blob);
95+ return NULL;
96+ }
97+ blob = p;
9298 d = blob + size;
9399 memcpy(d, s, l);
94100 size += l;
@@ -103,7 +109,12 @@
103109 }
104110 const size_t str_len_byte = str_len * sizeof(wchar_t);
105111 const size_t alloc_len = sizeof(size_t) + str_len_byte;
106- blob = (uint8_t *)realloc(blob, size + alloc_len);
112+ uint8_t *p = (uint8_t*)realloc(blob, size + alloc_len);
113+ if (p == NULL) {
114+ free(blob);
115+ return NULL;
116+ }
117+ blob = p;
107118 uint8_t *d = blob + size;
108119 *(size_t *)d = str_len;
109120 d += sizeof(size_t);
@@ -154,7 +165,10 @@
154165 else {
155166 const size_t byte_len = l * sizeof(wchar_t);
156167 wchar_t *str = (wchar_t *)malloc(byte_len);
157- wmemcpy(str, (wchar_t *)src, l);
168+ assert(str != NULL);
169+ if (str != NULL) {
170+ wmemcpy(str, (wchar_t*)src, l);
171+ }
158172 *d = str;
159173 src += byte_len;
160174 }
@@ -189,6 +203,7 @@
189203 static uint8_t *MakeSignature(size_t *size)
190204 {
191205 uint8_t *p = (uint8_t *)malloc(sizeof(signature));
206+ assert(p != NULL);
192207 memcpy(p, signature, sizeof(signature));
193208 *size = sizeof(signature);
194209 return p;
@@ -235,6 +250,8 @@
235250 { MALLOCED_WSTRING_INFO(TTTSet, UILanguageFileW_ini) },
236251 { MALLOCED_WSTRING_INFO(TTTSet, ExeDirW) },
237252 { MALLOCED_WSTRING_INFO(TTTSet, LogDirW) },
253+ { MALLOCED_WSTRING_INFO(TTTSet, LogDefaultPathW) },
254+ { MALLOCED_WSTRING_INFO(TTTSet, FileDirW) },
238255 { 0, 0, TSerializeInfo::COPY },
239256 };
240257
@@ -241,9 +258,9 @@
241258 /**
242259 * TTTSet 構造体をバイナリデータに変換
243260 *
244- * @param ts TTTSet構造体へのポインタ
245- * @return バイナリへのデータのサイズ
246- * @return バイナリへのデータへポインタ
261+ * @param[in] ts TTTSet構造体へのポインタ
262+ * @param[out] バイナリデータのサイズ
263+ * @return バイナリデータへポインタ
247264 */
248265 void *TTCMNSerialize(const TTTSet *ts, size_t *size)
249266 {
@@ -253,6 +270,7 @@
253270 uint8_t *data = SerializeData(ts, serialize_info, &data_size);
254271
255272 uint8_t *dest = (uint8_t *)malloc(signature_size + data_size);
273+ assert(dest != NULL);
256274 memcpy(dest, signature_data, signature_size);
257275 memcpy(dest + signature_size, data, data_size);
258276 free(data);
旧リポジトリブラウザで表示