Nikolay Sivov : comctl32/tab: Init TCITEM fields in TCM_GETITEM when invalid index passed.
Alexandre Julliard
julliard at winehq.org
Mon Aug 17 11:24:37 CDT 2009
Module: wine
Branch: master
Commit: f08747cbfc2677c06b12a470b0308c5306c105fb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f08747cbfc2677c06b12a470b0308c5306c105fb
Author: Nikolay Sivov <bunglehead at gmail.com>
Date: Sat Aug 15 00:05:06 2009 +0400
comctl32/tab: 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);
More information about the wine-cvs
mailing list