From 72a0485c8e3c39ed4a433109f381589968551f7e Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Mon, 2 Dec 2024 15:22:58 +0800 Subject: [PATCH 1/2] fix: hasVtable is incorrect when destructing Destruct function should be called by 'autoCleanVtable' instead of 'callOriginalFun'. 'glostVtable' should be delete before calling origin destruct, because 'resetVtable' maybe called when destructing origin destruct. pms: BUG-368399 --- src/vtablehook.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vtablehook.cpp b/src/vtablehook.cpp index 2c4d7624..e6920dee 100644 --- a/src/vtablehook.cpp +++ b/src/vtablehook.cpp @@ -185,15 +185,15 @@ void VtableHook::autoCleanVtable(const void *obj) if (!fun) return; - typedef void(*Destruct)(const void*); - Destruct destruct = reinterpret_cast(fun); - // call origin destruct function - destruct(obj); - if (hasVtable(obj)) {// 需要判断一下,有可能在执行析构函数时虚表已经被删除 // clean clearGhostVtable(obj); } + + typedef void(*Destruct)(const void*); + Destruct destruct = reinterpret_cast(fun); + // call origin destruct function + destruct(obj); } bool VtableHook::ensureVtable(const void *obj, std::function destoryObjFun) From 5c543d83b77c17532df2a908d1e5faf0f5f7bbe6 Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Mon, 2 Dec 2024 15:24:23 +0800 Subject: [PATCH 2/2] fix: app crashed when window destroyed in quick ghostVtable will be released whenever Window is destroyed by delete or deleteLater function, we don't need to resetVtable, and we shouldn't resetVtable when destructing m_window. pms: BUG-368399 --- xcb/dnotitlebarwindowhelper.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xcb/dnotitlebarwindowhelper.cpp b/xcb/dnotitlebarwindowhelper.cpp index e7377691..88465c0e 100644 --- a/xcb/dnotitlebarwindowhelper.cpp +++ b/xcb/dnotitlebarwindowhelper.cpp @@ -81,10 +81,6 @@ DNoTitlebarWindowHelper::~DNoTitlebarWindowHelper() { g_pressPoint.remove(this); - if (VtableHook::hasVtable(m_window)) { - VtableHook::resetVtable(m_window); - } - mapped.remove(qobject_cast(parent())); if (m_window->handle()) { // 当本地窗口还存在时,移除设置过的窗口属性