From b7fb763ec6bb1996bda54d288e9f9da28cc5c7b9 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Mon, 17 Sep 2012 20:33:22 +0000 Subject: [PATCH] winetest addition that QueryInterface with NULL dest behaves as it should. svn path=/trunk/; revision=57318 --- rostests/winetests/msxml3/domdoc.c | 29 ++++++++++++ rostests/winetests/msxml3/msxml3_ros.diff | 54 +++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 rostests/winetests/msxml3/msxml3_ros.diff diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index f59a001867b..9253fc6d136 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -1447,6 +1447,9 @@ static void _expect_list_len(IXMLDOMNodeList *list, LONG len, int line) #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) +#define EXPECT_NOT_HR(hr,hr_exp) \ + ok(hr != hr_exp, "got 0x%08x, expected not 0x%08x\n", hr, hr_exp) + static const WCHAR szEmpty[] = { 0 }; static const WCHAR szIncomplete[] = { '<','?','x','m','l',' ', @@ -4244,6 +4247,30 @@ static void test_get_text(void) free_bstrs(); } +/* + * This function is to display that xmlnodelist_QueryInterface + * generates SEGV for these conditions, and once fixed make sure + * it never does it again. + */ +static void verify_nodelist_query_interface(IXMLDOMNodeList *node_list) +{ + HRESULT hr; + /* + * NOTE: The following calls are supposed to test wine's + * xmlnodelist_QueryInterface behaving properly. + * While we should be able to expect E_POINTER (due to the NULL pointer), + * it seems MS' own implementation(s) violate the spec and return + * E_INVALIDARG. To not get cought be a potentially correct implementation + * in the future, we check for NOT S_OK. + */ + hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, NULL); + EXPECT_NOT_HR(hr, S_OK); + hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IDispatch, NULL); + EXPECT_NOT_HR(hr, S_OK); + hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IXMLDOMNodeList, NULL); + EXPECT_NOT_HR(hr, S_OK); +} + static void test_get_childNodes(void) { IXMLDOMNodeList *node_list, *node_list2; @@ -4271,6 +4298,8 @@ static void test_get_childNodes(void) hr = IXMLDOMElement_get_childNodes( element, &node_list ); EXPECT_HR(hr, S_OK); + verify_nodelist_query_interface(node_list); + hr = IXMLDOMNodeList_get_length( node_list, &len ); EXPECT_HR(hr, S_OK); ok( len == 4, "len %d\n", len); diff --git a/rostests/winetests/msxml3/msxml3_ros.diff b/rostests/winetests/msxml3/msxml3_ros.diff new file mode 100644 index 00000000000..acd15220a99 --- /dev/null +++ b/rostests/winetests/msxml3/msxml3_ros.diff @@ -0,0 +1,54 @@ +Index: domdoc.c +=================================================================== +--- domdoc.c (revision 57310) ++++ domdoc.c (working copy) +@@ -1447,6 +1447,9 @@ + #define EXPECT_HR(hr,hr_exp) \ + ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) + ++#define EXPECT_NOT_HR(hr,hr_exp) \ ++ ok(hr != hr_exp, "got 0x%08x, expected not 0x%08x\n", hr, hr_exp) ++ + static const WCHAR szEmpty[] = { 0 }; + static const WCHAR szIncomplete[] = { + '<','?','x','m','l',' ', +@@ -4244,6 +4247,30 @@ + free_bstrs(); + } + ++/* ++ * This function is to display that xmlnodelist_QueryInterface ++ * generates SEGV for these conditions, and once fixed make sure ++ * it never does it again. ++ */ ++static void verify_nodelist_query_interface(IXMLDOMNodeList *node_list) ++{ ++ HRESULT hr; ++ /* ++ * NOTE: The following calls are supposed to test wine's ++ * xmlnodelist_QueryInterface behaving properly. ++ * While we should be able to expect E_POINTER (due to the NULL pointer), ++ * it seems MS' own implementation(s) violate the spec and return ++ * E_INVALIDARG. To not get cought be a potentially correct implementation ++ * in the future, we check for NOT S_OK. ++ */ ++ hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, NULL); ++ EXPECT_NOT_HR(hr, S_OK); ++ hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IDispatch, NULL); ++ EXPECT_NOT_HR(hr, S_OK); ++ hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IXMLDOMNodeList, NULL); ++ EXPECT_NOT_HR(hr, S_OK); ++} ++ + static void test_get_childNodes(void) + { + IXMLDOMNodeList *node_list, *node_list2; +@@ -4271,6 +4298,8 @@ + hr = IXMLDOMElement_get_childNodes( element, &node_list ); + EXPECT_HR(hr, S_OK); + ++ verify_nodelist_query_interface(node_list); ++ + hr = IXMLDOMNodeList_get_length( node_list, &len ); + EXPECT_HR(hr, S_OK); + ok( len == 4, "len %d\n", len);