urlmon: Use unescaped Urls for FTP actions (try 2)

André Hentschel nerv at dawncrow.de
Thu Mar 17 14:58:13 CDT 2011


...don't leak path...
---
 dlls/urlmon/ftp.c |   16 ++++++++++++----
 1 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/dlls/urlmon/ftp.c b/dlls/urlmon/ftp.c
index c9d43b8..a27d84c 100644
--- a/dlls/urlmon/ftp.c
+++ b/dlls/urlmon/ftp.c
@@ -59,22 +59,30 @@ static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request
         HINTERNET internet_session, IInternetBindInfo *bind_info)
 {
     FtpProtocol *This = impl_from_Protocol(prot);
-    BSTR url;
+    DWORD path_size = INTERNET_MAX_URL_LENGTH;
+    BSTR url, path;
     HRESULT hres;
 
     hres = IUri_GetAbsoluteUri(uri, &url);
     if(FAILED(hres))
         return hres;
+    path = heap_alloc(path_size);
+    hres = UrlUnescapeW((LPWSTR)url, path, &path_size, 0);
+    SysFreeString(url);
+    if (FAILED(hres))
+    {
+        heap_free(path);
+        return hres;
+    }
 
-    This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
+    This->base.request = InternetOpenUrlW(internet_session, path, NULL, 0,
             request_flags|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_PASSIVE,
             (DWORD_PTR)&This->base);
-    SysFreeString(url);
+    heap_free(path);
     if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
         WARN("InternetOpenUrl failed: %d\n", GetLastError());
         return INET_E_RESOURCE_NOT_FOUND;
     }
-
     return S_OK;
 }
 
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list