Gabriel Ivăncescu : mshtml: Abort on a cancelled async request properly.

Alexandre Julliard julliard at winehq.org
Fri May 27 16:35:30 CDT 2022


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Thu May 26 19:54:28 2022 +0300

mshtml: Abort on a cancelled async request properly.

Gecko can cancel an async request sometime between async_start_doc_binding
registers it and on_start_nsrequest actually processes it. The latter should
not attempt to continue in this case.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/binding.h  | 1 +
 dlls/mshtml/navigate.c | 4 ++++
 dlls/mshtml/nsio.c     | 3 +++
 3 files changed, 8 insertions(+)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 26a337fe470..9a043864927 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -51,6 +51,7 @@ typedef struct {
     nsIURI *referrer;
     char *content_type;
     char *charset;
+    nsresult status;
     UINT32 response_status;
     char *response_status_text;
     REQUEST_METHOD request_method;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index d5ec368e375..e6f203535b7 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -981,6 +981,10 @@ static HRESULT on_start_nsrequest(nsChannelBSC *This)
 {
     nsresult nsres;
 
+    /* Async request can be cancelled before we got to it */
+    if(NS_FAILED(This->nschannel->status))
+        return E_ABORT; /* FIXME: map status to HRESULT */
+
     This->nschannel->binding = This;
 
     /* FIXME: it's needed for http connections from BindToObject. */
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index e0b8bedf79c..e1a1d6e3b53 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -610,6 +610,9 @@ static nsresult NSAPI nsChannel_Cancel(nsIHttpChannel *iface, nsresult aStatus)
 
     TRACE("(%p)->(%08lx)\n", This, aStatus);
 
+    if(NS_FAILED(aStatus))
+        This->status = aStatus;
+
     if(This->binding && This->binding->bsc.binding)
         IBinding_Abort(This->binding->bsc.binding);
     else




More information about the wine-cvs mailing list