[2/2] comctl32/tab: Init TCITEM fields in TCM_GETITEM when invalid index passed

Nikolay Sivov bunglehead at gmail.com
Sun Aug 16 08:57:50 CDT 2009


Fixes bug http://bugs.winehq.org/show_bug.cgi?id=19688

Changelog:
    - Init TCITEM fields in TCM_GETITEM when invalid index passed

>From d9baef918ce231cc6334084e74787acc778b1af6 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Sat, 15 Aug 2009 00:05:06 +0400
Subject: Init TCITEM fields in TCM_GETITEM when invalid index passed

---
 dlls/comctl32/tab.c       |    6 +++++
 dlls/comctl32/tests/tab.c |   54 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c
index 5c90883..94da29e 100644
--- a/dlls/comctl32/tab.c
+++ b/dlls/comctl32/tab.c
@@ -2813,7 +2813,13 @@ TAB_GetItemT (TAB_INFO *infoPtr, INT iItem, LPTCITEMW tabItem, BOOL bUnicode)
   if (!tabItem) return FALSE;
 
   if (iItem < 0 || iItem >= infoPtr->uNumItem)
+  {
+    /* init requested fields */
+    if (tabItem->mask & TCIF_IMAGE) tabItem->iImage  = 0;
+    if (tabItem->mask & TCIF_PARAM) tabItem->lParam  = 0;
+    if (tabItem->mask & TCIF_STATE) tabItem->dwState = 0;
     return FALSE;
+  }
 
   wineItem = TAB_GetItem(infoPtr, iItem);
 
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c
index 9163f92..0361d32 100644
--- a/dlls/comctl32/tests/tab.c
+++ b/dlls/comctl32/tests/tab.c
@@ -842,12 +842,66 @@ static void test_getters_setters(HWND parent_wnd, INT nTabs)
         ret = SendMessage(hTab, TCM_GETITEM, 0, (LPARAM)NULL);
         expect(FALSE, ret);
 
+        /* passing invalid index should result in initialization to zero
+           for members mentioned in mask requested */
+
+        /* valid range here is [0,4] */
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_PARAM;
+        ret = SendMessage(hTab, TCM_GETITEM, 5, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        ok(tcItem.lParam == 0, "Expected zero lParam, got %lu\n", tcItem.lParam);
+
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_IMAGE;
+        ret = SendMessage(hTab, TCM_GETITEM, 5, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        expect(0, tcItem.iImage);
+
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_TEXT;
+        tcItem.pszText = szText;
+        szText[0] = 'a';
+        ret = SendMessage(hTab, TCM_GETITEM, 5, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        expect('a', szText[0]);
+
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_STATE;
+        tcItem.dwStateMask = 0;
+        tcItem.dwState = TCIS_BUTTONPRESSED;
+        ret = SendMessage(hTab, TCM_GETITEM, 5, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        ok(tcItem.dwState == 0, "Expected zero dwState, got %u\n", tcItem.dwState);
+
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_STATE;
+        tcItem.dwStateMask = TCIS_BUTTONPRESSED;
+        tcItem.dwState = TCIS_BUTTONPRESSED;
+        ret = SendMessage(hTab, TCM_GETITEM, 5, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        ok(tcItem.dwState == 0, "Expected zero dwState\n");
+
+        /* check with negative index to be sure */
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_PARAM;
+        ret = SendMessage(hTab, TCM_GETITEM, -1, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        ok(tcItem.lParam == 0, "Expected zero lParam, got %lu\n", tcItem.lParam);
+
+        memset(&tcItem, 0xcc, sizeof(tcItem));
+        tcItem.mask = TCIF_PARAM;
+        ret = SendMessage(hTab, TCM_GETITEM, -2, (LPARAM)&tcItem);
+        expect(FALSE, ret);
+        ok(tcItem.lParam == 0, "Expected zero lParam, got %lu\n", tcItem.lParam);
+
         flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
         tcItem.mask = TCIF_TEXT;
         tcItem.pszText = &szText[0];
         tcItem.cchTextMax = sizeof(szText);
 
+        strcpy(szText, "New Label");
         ok ( SendMessage(hTab, TCM_SETITEM, 0, (LPARAM) &tcItem), "Setting new item failed.\n");
         ok ( SendMessage(hTab, TCM_GETITEM, 0, (LPARAM) &tcItem), "Getting item failed.\n");
         expect_str("New Label", tcItem.pszText);
-- 
1.5.6.5





More information about the wine-patches mailing list