From bcf4329b3535ee0dc5dea708f14dfb9bf4ab4fc4 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 25 May 2023 20:23:58 +0300 Subject: Jabber: fix for possible memory corruption --- include/m_chat_int.h | 19 +++++++++++-------- libs/win32/mir_app.lib | Bin 260212 -> 261834 bytes libs/win64/mir_app.lib | Bin 258958 -> 260832 bytes protocols/JabberG/src/jabber_thread.cpp | 2 +- src/mir_app/src/chat_svc.cpp | 7 +++++++ src/mir_app/src/mir_app.def | 3 ++- src/mir_app/src/mir_app64.def | 3 ++- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/include/m_chat_int.h b/include/m_chat_int.h index a244af5929..319559a1ef 100644 --- a/include/m_chat_int.h +++ b/include/m_chat_int.h @@ -352,29 +352,32 @@ struct CHAT_MANAGER extern MIR_APP_EXPORT CHAT_MANAGER g_chatApi; -EXTERN_C MIR_APP_DLL(CHAT_MANAGER*) Chat_CustomizeApi(const CHAT_MANAGER_INITDATA *pData); +MIR_APP_DLL(CHAT_MANAGER*) Chat_CustomizeApi(const CHAT_MANAGER_INITDATA *pData); ///////////////////////////////////////////////////////////////////////////////////////// // updates options for all windows -EXTERN_C MIR_APP_DLL(void) Chat_UpdateOptions(); +MIR_APP_DLL(void) Chat_UpdateOptions(); // runs ME_GC_EVENT with the parameters passed -EXTERN_C MIR_APP_DLL(BOOL) Chat_DoEventHook(SESSION_INFO *si, int iType, const USERINFO *pUser, const wchar_t* pszText, INT_PTR dwItem); +MIR_APP_DLL(BOOL) Chat_DoEventHook(SESSION_INFO *si, int iType, const USERINFO *pUser, const wchar_t* pszText, INT_PTR dwItem); + +// wipes chat's history +MIR_APP_DLL(void) Chat_EmptyHistory(SESSION_INFO *si); // creates custom popup menu for a group chat -EXTERN_C MIR_APP_DLL(UINT) Chat_CreateMenu(HWND hwnd, HMENU hMenu, POINT pt, SESSION_INFO *si, const wchar_t *pszUID); +MIR_APP_DLL(UINT) Chat_CreateMenu(HWND hwnd, HMENU hMenu, POINT pt, SESSION_INFO *si, const wchar_t *pszUID); // calculates width or height of a string -EXTERN_C MIR_APP_DLL(int) Chat_GetTextPixelSize(const wchar_t *pszText, HFONT hFont, bool bWidth); +MIR_APP_DLL(int) Chat_GetTextPixelSize(const wchar_t *pszText, HFONT hFont, bool bWidth); // creates a default description of a group chat event // returns true if lin->ptszText is already utilized, you need to add it manually then otherwise -EXTERN_C MIR_APP_DLL(bool) Chat_GetDefaultEventDescr(const SESSION_INFO *si, const LOGINFO *lin, CMStringW &res); +MIR_APP_DLL(bool) Chat_GetDefaultEventDescr(const SESSION_INFO *si, const LOGINFO *lin, CMStringW &res); // sets mute mode for a group chat -EXTERN_C MIR_APP_DLL(int) Chat_IsMuted(MCONTACT hContact); -EXTERN_C MIR_APP_DLL(void) Chat_Mute(MCONTACT hContact, int mode); +MIR_APP_DLL(int) Chat_IsMuted(MCONTACT hContact); +MIR_APP_DLL(void) Chat_Mute(MCONTACT hContact, int mode); // resets filters for all session MIR_APP_DLL(void) Chat_ReconfigureFilters(); diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib index e28b7b6afd..7e62661a72 100644 Binary files a/libs/win32/mir_app.lib and b/libs/win32/mir_app.lib differ diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib index b543fabc91..947e6f5b77 100644 Binary files a/libs/win64/mir_app.lib and b/libs/win64/mir_app.lib differ diff --git a/protocols/JabberG/src/jabber_thread.cpp b/protocols/JabberG/src/jabber_thread.cpp index fcf189bc13..5aebee770e 100644 --- a/protocols/JabberG/src/jabber_thread.cpp +++ b/protocols/JabberG/src/jabber_thread.cpp @@ -268,7 +268,7 @@ void CJabberProto::ServerThread(JABBER_CONN_DATA *pParam) LISTFOREACH(i, this, LIST_CHATROOM) if (auto *item = ListGetItemPtrFromIndex(i)) { if (item->si) - item->si->arEvents.destroy(); + Chat_EmptyHistory(item->si); GcQuit(item, 0, nullptr); } diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index e03d826320..fdc32abcc9 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -763,6 +763,13 @@ MIR_APP_DLL(int) Chat_SetUserInfo(SESSION_INFO *si, void *pItemData) return GC_EVENT_ERROR; } +MIR_APP_DLL(void) Chat_EmptyHistory(SESSION_INFO *si) +{ + mir_cslock lck(csChat); + if (g_arSessions.indexOf(si) != -1) + si->arEvents.destroy(); +} + MIR_APP_DLL(void) Chat_UpdateOptions() { for (auto &si : g_arSessions) diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index db1745335c..d0abb0ecb0 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -346,7 +346,7 @@ Chat_DoEventHook @445 NONAME _stubLogProc@16 @446 NONAME _stubMessageProc@16 @447 NONAME _stubNicklistProc@16 @448 NONAME -Chat_GetTextPixelSize @449 NONAME +?Chat_GetTextPixelSize@@YGHPB_WPAUHFONT__@@_N@Z @449 NONAME ?NotifyEvent@CSrmmBaseDialog@@IAEHH@Z @450 NONAME Srmm_GetWindowData @451 ?Srmm_FindWindow@@YGPAUHWND__@@I@Z @452 NONAME @@ -874,3 +874,4 @@ Chat_IsMuted @941 NONAME Clist_RemoveEvent @989 ?Clist_GetEventByMenu@@YGPAUCListEvent@@H@Z @990 NONAME ?Clist_GetEventCount@@YGHXZ @991 NONAME +?Chat_EmptyHistory@@YGXPAUSESSION_INFO@@@Z @992 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index cfc6f9556e..ce3a55a6fd 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -346,7 +346,7 @@ Chat_DoEventHook @445 NONAME stubLogProc @446 NONAME stubMessageProc @447 NONAME stubNicklistProc @448 NONAME -Chat_GetTextPixelSize @449 NONAME +?Chat_GetTextPixelSize@@YAHPEB_WPEAUHFONT__@@_N@Z @449 NONAME ?NotifyEvent@CSrmmBaseDialog@@IEAAHH@Z @450 NONAME Srmm_GetWindowData @451 ?Srmm_FindWindow@@YAPEAUHWND__@@I@Z @452 NONAME @@ -874,3 +874,4 @@ Chat_IsMuted @941 NONAME Clist_RemoveEvent @989 ?Clist_GetEventByMenu@@YAPEAUCListEvent@@H@Z @990 NONAME ?Clist_GetEventCount@@YAHXZ @991 NONAME +?Chat_EmptyHistory@@YAXPEAUSESSION_INFO@@@Z @992 NONAME -- cgit v1.2.3