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 *