[Ttssh2-commit] [8175] ツールチップのWM_NCDESTROY時にデータを再参照できなくした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2019年 9月 16日 (月) 23:36:02 JST


Revision: 8175
          https://osdn.net/projects/ttssh2/scm/svn/commits/8175
Author:   yasuhide
Date:     2019-09-16 23:36:02 +0900 (Mon, 16 Sep 2019)
Log Message:
-----------
ツールチップのWM_NCDESTROY時にデータを再参照できなくした

tWinの値をクリアした。
メモリリークを防ぐためdelete selfした。

tWinの値がクリアされていないために次の問題が発生していた
- DestroyWindow() でWM_NCDESTROYが発行される
- WM_NCDESTROYでfree後にdelete selfされ、TipWinのデストラクタが実行される
- TipWinのデストラクタでDestroy()が実行される
- Destroy()中にtWinの存在を確認するが、クリア漏れで再度DestroyWindow()が実行される
- DestroyWindow() でTipWinのハンドルにWM_NCDESTROYが発行されるとループする

開発環境ではfreeしたメモリ領域には0xddや0xfeeefeeeが埋められる。
そのため不正なハンドルにDestroyWindow()が実行されるが失敗し、一見正常動作したように見える

実行環境ではfree後も内容が残存するため、今回のクリアを怠ると、
DestroyWindow()にTipWinのハンドルが渡ってしまう。
結果としてDestroyWindow()が何度も実行されてしまい異常動作する。

Modified Paths:
--------------
    trunk/teraterm/common/tipwin.cpp

-------------- next part --------------
Modified: trunk/teraterm/common/tipwin.cpp
===================================================================
--- trunk/teraterm/common/tipwin.cpp	2019-09-16 13:39:31 UTC (rev 8174)
+++ trunk/teraterm/common/tipwin.cpp	2019-09-16 14:36:02 UTC (rev 8175)
@@ -186,6 +186,8 @@
 			if (self->IsExists() && self->tWin->auto_destroy) {
 				free((void *)self->tWin->str);
 				free(self->tWin);
+				self->tWin = NULL;
+				delete self;
 				/*
 				 * use-after-free\x82ɂ\xE6\x82\xE8Tera Term\x82̓\xAE\x8D삪\x95s\x88\xC0\x92\xE8\x82ƂȂ\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
 				 *


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