From acfd725df406b9cc250da18c2d427e4a97176262 Mon Sep 17 00:00:00 2001 From: Robert Shearman Date: Mon, 25 Oct 2004 21:44:50 +0000 Subject: [PATCH] - Don't leak memory when an app sends TTM_SETTITLE twice. - An lParam of 0 indicates that the title should be removed. --- dlls/comctl32/tooltips.c | 46 ++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c index 15bb59bf0da..1bd13e25c81 100644 --- a/dlls/comctl32/tooltips.c +++ b/dlls/comctl32/tooltips.c @@ -1927,16 +1927,25 @@ TOOLTIPS_SetTitleA (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPCSTR pszTitle = (LPCSTR)lParam; - UINT uTitleIcon = (UINT)wParam; + UINT_PTR uTitleIcon = (UINT_PTR)wParam; UINT size; - TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, pszTitle, (void*)uTitleIcon); + TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_a(pszTitle), + (void*)uTitleIcon); + + Free(infoPtr->pszTitle); + + if (pszTitle) + { + size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0); + infoPtr->pszTitle = Alloc(size); + if (!infoPtr->pszTitle) + return FALSE; + MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR)); + } + else + infoPtr->pszTitle = NULL; - size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0); - infoPtr->pszTitle = Alloc(size); - if (!infoPtr->pszTitle) - return FALSE; - MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR)); if (uTitleIcon <= TTI_ERROR) infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon]; else @@ -1951,16 +1960,25 @@ TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPCWSTR pszTitle = (LPCWSTR)lParam; - UINT uTitleIcon = (UINT)wParam; + UINT_PTR uTitleIcon = (UINT_PTR)wParam; UINT size; - TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle), (void*)uTitleIcon); + TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle), + (void*)uTitleIcon); + + Free(infoPtr->pszTitle); + + if (pszTitle) + { + size = (strlenW(pszTitle)+1)*sizeof(WCHAR); + infoPtr->pszTitle = Alloc(size); + if (!infoPtr->pszTitle) + return FALSE; + memcpy(infoPtr->pszTitle, pszTitle, size); + } + else + infoPtr->pszTitle = NULL; - size = (strlenW(pszTitle)+1)*sizeof(WCHAR); - infoPtr->pszTitle = Alloc(size); - if (!infoPtr->pszTitle) - return FALSE; - memcpy(infoPtr->pszTitle, pszTitle, size); if (uTitleIcon <= TTI_ERROR) infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon]; else