Jacek Caban : urlmon/tests: Use the same thread for both connections in redirect tests.

Alexandre Julliard julliard at winehq.org
Tue May 22 15:37:13 CDT 2018


Module: wine
Branch: master
Commit: 749dbd81b1cbd24e5ec3df0ce97712c1e9945c9e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=749dbd81b1cbd24e5ec3df0ce97712c1e9945c9e

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue May 22 10:13:52 2018 +0200

urlmon/tests: Use the same thread for both connections in redirect tests.

Fixes a race spotted by Zebediah Figura.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/urlmon/tests/protocol.c | 58 +++++++++++++++++++++++---------------------
 1 file changed, 31 insertions(+), 27 deletions(-)

diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index 78b882b..f5543fe 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -156,7 +156,7 @@ static PROTOCOLDATA protocoldata, *pdata, continue_protdata;
 static DWORD prot_read, filter_state, http_post_test, thread_id;
 static BOOL security_problem, test_async_req, impl_protex;
 static BOOL async_read_pending, mimefilter_test, direct_read, wait_for_switch, emulate_prot, short_read, test_abort;
-static BOOL empty_file, no_mime, bind_from_cache, file_with_hash;
+static BOOL empty_file, no_mime, bind_from_cache, file_with_hash, reuse_protocol_thread;
 
 enum {
     STATE_CONNECTING,
@@ -1611,40 +1611,41 @@ static HRESULT WINAPI ProtocolEmul_QueryInterface(IInternetProtocolEx *iface, RE
 
 static DWORD WINAPI thread_proc(PVOID arg)
 {
-    BOOL redirect_only = redirect_on_continue;
+    BOOL redirect = redirect_on_continue;
     HRESULT hres;
 
     memset(&protocoldata, -1, sizeof(protocoldata));
 
-    prot_state = 0;
+    while(1) {
+        prot_state = 0;
 
-    SET_EXPECT(ReportProgress_FINDINGRESOURCE);
-    hres = IInternetProtocolSink_ReportProgress(binding_sink,
-            BINDSTATUS_FINDINGRESOURCE, hostW);
-    CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
-    ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+        SET_EXPECT(ReportProgress_FINDINGRESOURCE);
+        hres = IInternetProtocolSink_ReportProgress(binding_sink,
+                BINDSTATUS_FINDINGRESOURCE, hostW);
+        CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
+        ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
 
-    SET_EXPECT(ReportProgress_CONNECTING);
-    hres = IInternetProtocolSink_ReportProgress(binding_sink,
-            BINDSTATUS_CONNECTING, winehq_ipW);
-    CHECK_CALLED(ReportProgress_CONNECTING);
-    ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+        SET_EXPECT(ReportProgress_CONNECTING);
+        hres = IInternetProtocolSink_ReportProgress(binding_sink,
+                BINDSTATUS_CONNECTING, winehq_ipW);
+        CHECK_CALLED(ReportProgress_CONNECTING);
+        ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
 
-    SET_EXPECT(ReportProgress_SENDINGREQUEST);
-    hres = IInternetProtocolSink_ReportProgress(binding_sink,
-            BINDSTATUS_SENDINGREQUEST, NULL);
-    CHECK_CALLED(ReportProgress_SENDINGREQUEST);
-    ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+        SET_EXPECT(ReportProgress_SENDINGREQUEST);
+        hres = IInternetProtocolSink_ReportProgress(binding_sink,
+                BINDSTATUS_SENDINGREQUEST, NULL);
+        CHECK_CALLED(ReportProgress_SENDINGREQUEST);
+        ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
 
-    prot_state = 1;
-    SET_EXPECT(Switch);
-    hres = IInternetProtocolSink_Switch(binding_sink, &protocoldata);
-    CHECK_CALLED(Switch);
-    ok(hres == S_OK, "Switch failed: %08x\n", hres);
+        prot_state = 1;
+        SET_EXPECT(Switch);
+        hres = IInternetProtocolSink_Switch(binding_sink, &protocoldata);
+        CHECK_CALLED(Switch);
+        ok(hres == S_OK, "Switch failed: %08x\n", hres);
 
-    if(redirect_only) {
-        prot_state = 0;
-        return 0;
+        if(!redirect)
+            break;
+        redirect = FALSE;
     }
 
     if(!short_read) {
@@ -1799,7 +1800,8 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo
 
         IServiceProvider_Release(service_provider);
 
-        CreateThread(NULL, 0, thread_proc, NULL, 0, &tid);
+        if(!reuse_protocol_thread)
+            CreateThread(NULL, 0, thread_proc, NULL, 0, &tid);
         return;
     }
 
@@ -1909,6 +1911,7 @@ static HRESULT WINAPI ProtocolEmul_Continue(IInternetProtocolEx *iface,
 
         if(redirect_on_continue) {
             redirect_on_continue = FALSE;
+            reuse_protocol_thread = TRUE;
 
             if(bindinfo_options & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS)
                 SET_EXPECT(Redirect);
@@ -2632,6 +2635,7 @@ static void init_test(int prot, DWORD flags)
     bind_from_cache = (flags & TEST_FROMCACHE) != 0;
     file_with_hash = FALSE;
     security_problem = FALSE;
+    reuse_protocol_thread = FALSE;
 
     bindinfo_options = 0;
     if(flags & TEST_DISABLEAUTOREDIRECT)




More information about the wine-cvs mailing list