Mikołaj Zalewski : comctl32: header: Avoid freeing invalid pointers.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Apr 20 04:40:12 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: b82156586e0462a6c4d0ba9239a4931347b390a1
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b82156586e0462a6c4d0ba9239a4931347b390a1
Author: Mikołaj Zalewski <mikolaj at zalewski.pl>
Date: Wed Apr 19 21:30:29 2006 +0200
comctl32: header: Avoid freeing invalid pointers.
---
dlls/comctl32/header.c | 23 +++++++++++++++--------
1 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index 5cfb811..cddf740 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -99,7 +99,16 @@ #define HDN_FIRST_UNICODE (HDN_FIRST-HDN
#define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongPtrW(hwnd,0))
static const WCHAR themeClass[] = {'H','e','a','d','e','r',0};
+static WCHAR emptyString[] = {0};
+static void HEADER_DisposeItem(HEADER_ITEM *lpItem)
+{
+ if (lpItem->pszText && lpItem->pszText != emptyString &&
+ lpItem->pszText != LPSTR_TEXTCALLBACKW) /* covers LPSTR_TEXTCALLBACKA too */
+ {
+ Free(lpItem->pszText);
+ }
+}
inline static LRESULT
HEADER_IndexToOrder (HWND hwnd, INT iItem)
@@ -796,8 +805,7 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wPa
if (infoPtr->uNumItem == 1) {
TRACE("Simple delete!\n");
- if (infoPtr->items[0].pszText)
- Free (infoPtr->items[0].pszText);
+ HEADER_DisposeItem(&infoPtr->items[0]);
Free (infoPtr->items);
Free(infoPtr->order);
infoPtr->items = 0;
@@ -812,8 +820,7 @@ HEADER_DeleteItem (HWND hwnd, WPARAM wPa
for (i = 0; i < infoPtr->uNumItem; i++)
TRACE("%d: order=%d, iOrder=%d, ->iOrder=%d\n", i, infoPtr->order[i], infoPtr->items[i].iOrder, infoPtr->items[infoPtr->order[i]].iOrder);
- if (infoPtr->items[iItem].pszText)
- Free (infoPtr->items[iItem].pszText);
+ HEADER_DisposeItem(&infoPtr->items[iItem]);
iOrder = infoPtr->items[iItem].iOrder;
infoPtr->uNumItem--;
@@ -1111,7 +1118,7 @@ HEADER_InsertItemT (HWND hwnd, INT nItem
if (phdi->mask & HDI_TEXT)
{
- if (!phdi->pszText) phdi->pszText = '\0'; /* null pointer check */
+ if (!phdi->pszText) phdi->pszText = emptyString; /* null pointer check */
if (phdi->pszText != LPSTR_TEXTCALLBACKW) /* covers != TEXTCALLBACKA too */
{
if (bUnicode)
@@ -1255,7 +1262,8 @@ HEADER_SetItemT (HWND hwnd, INT nItem, L
{
if (lpItem->pszText)
{
- Free(lpItem->pszText);
+ if (lpItem->pszText != emptyString && lpItem->pszText != LPSTR_TEXTCALLBACKW)
+ Free(lpItem->pszText);
lpItem->pszText = NULL;
}
if (phdi->pszText)
@@ -1374,8 +1382,7 @@ HEADER_Destroy (HWND hwnd, WPARAM wParam
if (infoPtr->items) {
lpItem = infoPtr->items;
for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
- if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACKW))
- Free (lpItem->pszText);
+ HEADER_DisposeItem(lpItem);
}
Free (infoPtr->items);
}
More information about the wine-cvs
mailing list