[PATCH 1/2] comctl32/tests: test toolbar separator with uninitialized iString
Giuseppe Bilotta
giuseppe.bilotta at gmail.com
Wed Apr 22 17:57:15 CDT 2009
Trying to add a separator with an invalid pointer in iString to a
toolbar works in Windows, showing that the field is ignored.
---
dlls/comctl32/tests/toolbar.c | 51 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c
index 1946095..91a72e0 100644
--- a/dlls/comctl32/tests/toolbar.c
+++ b/dlls/comctl32/tests/toolbar.c
@@ -1300,6 +1300,56 @@ static void test_getstring(void)
DestroyWindow(hToolbar);
}
+static void test_deadbeef(void)
+{
+ HWND hToolbar = NULL;
+ TBBUTTON buttons[2];
+ INT r;
+
+ rebuild_toolbar_with_buttons(&hToolbar);
+
+ ZeroMemory(&buttons, sizeof(buttons));
+
+ /* Some programs (e.g. Graphmatica 2.0f) forget to initialize the iString
+ * field for separators. If the random bit pattern of this field looks like
+ * a pointer, trying to follow it casues a crash (pagefault). This does not
+ * happen in Windows XP, 2008 or Vista, suggesting that this field is
+ * ignored in Windows in this case. */
+ buttons[0].idCommand = 0;
+ buttons[0].fsStyle = BTNS_SEP;
+ buttons[0].fsState = TBSTATE_ENABLED;
+ buttons[0].iString = 0xdeadbeef;
+
+#if 0
+ /* It is also possible that a poorly written program doesn't initialize the
+ * iString field of an actual button. Different versions of Windows seem to
+ * operate differently in this case.
+ * + Windows XP doesn't seem to be bothered in the least
+ * + Windows 2008 crashes
+ * + Windows Vista does not crash, but the subsequent TB_ADDBUTTONS
+ * call fails
+ * Since I know of no program that suffers from this particular issue, I'm
+ * commenting out this part of the test for the time being. If it gets
+ * uncommented, the subsequent TB_ADDBUTTONS should be adjusted
+ * appropriately. */
+
+ buttons[1].idCommand = 1;
+ buttons[1].fsStyle = BTNS_BUTTON;
+ buttons[1].fsState = 0;
+ buttons[1].iString = 0xdeadbeef;
+#endif
+
+ r = SendMessage(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)buttons);
+ expect(1, r);
+
+ /* TODO: another test that might be worth doing, to get more insight on how
+ * Windows handles things, would be to introduce a separator with
+ * 0xdeadbeef as iString, and then change its style to make into a real
+ * button. */
+
+ DestroyWindow(hToolbar);
+}
+
START_TEST(toolbar)
{
WNDCLASSA wc;
@@ -1336,6 +1386,7 @@ START_TEST(toolbar)
test_dispinfo();
test_setrows();
test_getstring();
+ test_deadbeef();
PostQuitMessage(0);
while(GetMessageA(&msg,0,0,0)) {
--
1.6.2.254.g84bde
More information about the wine-patches
mailing list