Alistair Leslie-Hughes : urlmon: Pass unescaped URLs to InternetOpenUrl in ftp protocol handler.

Alexandre Julliard julliard at winehq.org
Tue Mar 26 16:43:15 CDT 2019


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Tue Mar 26 15:21:32 2019 +0100

urlmon: Pass unescaped URLs to InternetOpenUrl in ftp protocol handler.

Based on a patch by André Hentschel.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=26445
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/urlmon/ftp.c             | 21 ++++++++++++---------
 dlls/urlmon/tests/Makefile.in |  2 +-
 dlls/urlmon/tests/url.c       | 10 +++++++++-
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/dlls/urlmon/ftp.c b/dlls/urlmon/ftp.c
index aef4a6c..75704ce 100644
--- a/dlls/urlmon/ftp.c
+++ b/dlls/urlmon/ftp.c
@@ -66,6 +66,7 @@ static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request
         HINTERNET internet_session, IInternetBindInfo *bind_info)
 {
     FtpProtocol *This = impl_from_Protocol(prot);
+    DWORD path_size = 0;
     BSTR url;
     HRESULT hres;
 
@@ -73,16 +74,18 @@ static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request
     if(FAILED(hres))
         return hres;
 
-    This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
-            request_flags|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_PASSIVE,
-            (DWORD_PTR)&This->base);
-    SysFreeString(url);
-    if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
-        WARN("InternetOpenUrl failed: %d\n", GetLastError());
-        return INET_E_RESOURCE_NOT_FOUND;
+    hres = UrlUnescapeW(url, NULL, &path_size, URL_UNESCAPE_INPLACE);
+    if(SUCCEEDED(hres)) {
+        This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
+                request_flags|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_PASSIVE,
+                (DWORD_PTR)&This->base);
+        if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
+            WARN("InternetOpenUrl failed: %d\n", GetLastError());
+            hres = INET_E_RESOURCE_NOT_FOUND;
+        }
     }
-
-    return S_OK;
+    SysFreeString(url);
+    return hres;
 }
 
 static HRESULT FtpProtocol_end_request(Protocol *prot)
diff --git a/dlls/urlmon/tests/Makefile.in b/dlls/urlmon/tests/Makefile.in
index 2eef129..7217f53 100644
--- a/dlls/urlmon/tests/Makefile.in
+++ b/dlls/urlmon/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = urlmon.dll
-IMPORTS   = urlmon wininet ole32 oleaut32 user32 advapi32
+IMPORTS   = urlmon wininet ole32 oleaut32 shlwapi user32 advapi32
 
 C_SRCS = \
 	generated.c \
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index ada78c9..0f2b14e 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -32,6 +32,7 @@
 #include "urlmon.h"
 #include "wininet.h"
 #include "mshtml.h"
+#include "shlwapi.h"
 
 #include "wine/test.h"
 
@@ -2905,7 +2906,7 @@ static void init_bind_test(int protocol, DWORD flags, DWORD t)
         url_a = (flags & BINDTEST_INVALID_CN) ? "https://4.15.184.77/favicon.ico" : "https://test.winehq.org/tests/hello.html";
         break;
     case FTP_TEST:
-        url_a = "ftp://ftp.winehq.org/welcome.msg";
+        url_a = "ftp://ftp.winehq.org/welcome%2emsg";
         break;
     default:
         url_a = "winetest:test";
@@ -2969,6 +2970,13 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
     if(FAILED(hres))
         return;
 
+    if(protocol == FTP_TEST)
+    {
+        /* FTP url dont have any escape characters, so convert the url to what is expected */
+        DWORD size = 0;
+        UrlUnescapeW(current_url, NULL, &size, URL_UNESCAPE_INPLACE);
+    }
+
     hres = IMoniker_QueryInterface(mon, &IID_IBinding, (void**)&bind);
     ok(hres == E_NOINTERFACE, "IMoniker should not have IBinding interface\n");
     if(SUCCEEDED(hres))




More information about the wine-cvs mailing list