セッションの複製後、「ディレクトリを変更」で落ちる
- セッションの複製時に構造体のコピーができていなかった
- 最近追加したパスやファイル名のコピーをケアしていなかった
Ticket #44553
@@ -347,7 +347,13 @@ | ||
347 | 347 | char reserve[20]; |
348 | 348 | } cygterm_t; |
349 | 349 | |
350 | -/* TTTSet */ | |
350 | +/** | |
351 | + * TTTSet | |
352 | + * セッションの複製時 | |
353 | + * この構造体は複製先にコピーされる | |
354 | + * path等、動的に確保した部分のコピーは | |
355 | + * ../ttcmn_dup.cpp を参照 | |
356 | + */ | |
351 | 357 | struct tttset { |
352 | 358 | /*------ VTSet --------*/ |
353 | 359 | /* Tera Term home directory */ |
@@ -27,11 +27,12 @@ | ||
27 | 27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | 28 | */ |
29 | 29 | |
30 | -#include <direct.h> | |
31 | 30 | #include <string.h> |
32 | 31 | #include <stdio.h> |
33 | 32 | #include <windows.h> |
34 | 33 | #include <assert.h> |
34 | +#define _CRTDBG_MAP_ALLOC | |
35 | +#include <stdlib.h> | |
35 | 36 | #include <crtdbg.h> |
36 | 37 | #include <wchar.h> |
37 | 38 | #if (defined(_MSC_VER) && (_MSC_VER >= 1600)) || !defined(_MSC_VER) |
@@ -61,7 +62,7 @@ | ||
61 | 62 | size_t offset; // 先頭からのオフセット |
62 | 63 | enum { |
63 | 64 | COPY = 0, // データをコピーする |
64 | - MALLOCED_WSTRING = 1, // mallocした領域の | |
65 | + MALLOCED_WSTRING = 1, // mallocした領域の wchar_t 文字列 | |
65 | 66 | } type; |
66 | 67 | } TSerializeInfo; |
67 | 68 |
@@ -88,7 +89,12 @@ | ||
88 | 89 | const size_t l = info->size; |
89 | 90 | unsigned char *d; |
90 | 91 | 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; | |
92 | 98 | d = blob + size; |
93 | 99 | memcpy(d, s, l); |
94 | 100 | size += l; |
@@ -103,7 +109,12 @@ | ||
103 | 109 | } |
104 | 110 | const size_t str_len_byte = str_len * sizeof(wchar_t); |
105 | 111 | 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; | |
107 | 118 | uint8_t *d = blob + size; |
108 | 119 | *(size_t *)d = str_len; |
109 | 120 | d += sizeof(size_t); |
@@ -154,7 +165,10 @@ | ||
154 | 165 | else { |
155 | 166 | const size_t byte_len = l * sizeof(wchar_t); |
156 | 167 | 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 | + } | |
158 | 172 | *d = str; |
159 | 173 | src += byte_len; |
160 | 174 | } |
@@ -189,6 +203,7 @@ | ||
189 | 203 | static uint8_t *MakeSignature(size_t *size) |
190 | 204 | { |
191 | 205 | uint8_t *p = (uint8_t *)malloc(sizeof(signature)); |
206 | + assert(p != NULL); | |
192 | 207 | memcpy(p, signature, sizeof(signature)); |
193 | 208 | *size = sizeof(signature); |
194 | 209 | return p; |
@@ -235,6 +250,8 @@ | ||
235 | 250 | { MALLOCED_WSTRING_INFO(TTTSet, UILanguageFileW_ini) }, |
236 | 251 | { MALLOCED_WSTRING_INFO(TTTSet, ExeDirW) }, |
237 | 252 | { MALLOCED_WSTRING_INFO(TTTSet, LogDirW) }, |
253 | + { MALLOCED_WSTRING_INFO(TTTSet, LogDefaultPathW) }, | |
254 | + { MALLOCED_WSTRING_INFO(TTTSet, FileDirW) }, | |
238 | 255 | { 0, 0, TSerializeInfo::COPY }, |
239 | 256 | }; |
240 | 257 |
@@ -241,9 +258,9 @@ | ||
241 | 258 | /** |
242 | 259 | * TTTSet 構造体をバイナリデータに変換 |
243 | 260 | * |
244 | - * @param ts TTTSet構造体へのポインタ | |
245 | - * @return バイナリへのデータのサイズ | |
246 | - * @return バイナリへのデータへポインタ | |
261 | + * @param[in] ts TTTSet構造体へのポインタ | |
262 | + * @param[out] バイナリデータのサイズ | |
263 | + * @return バイナリデータへポインタ | |
247 | 264 | */ |
248 | 265 | void *TTCMNSerialize(const TTTSet *ts, size_t *size) |
249 | 266 | { |
@@ -253,6 +270,7 @@ | ||
253 | 270 | uint8_t *data = SerializeData(ts, serialize_info, &data_size); |
254 | 271 | |
255 | 272 | uint8_t *dest = (uint8_t *)malloc(signature_size + data_size); |
273 | + assert(dest != NULL); | |
256 | 274 | memcpy(dest, signature_data, signature_size); |
257 | 275 | memcpy(dest + signature_size, data, data_size); |
258 | 276 | free(data); |