Jacek Caban : itss: Fix handling URLs with back slashes and escaped
URLs.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Feb 23 05:28:13 CST 2007
Module: wine
Branch: master
Commit: 2cc9eb166528c85746ee6f1c57239ad0156b4481
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2cc9eb166528c85746ee6f1c57239ad0156b4481
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 22 21:09:31 2007 +0100
itss: Fix handling URLs with back slashes and escaped URLs.
---
dlls/itss/Makefile.in | 2 +-
dlls/itss/protocol.c | 58 +++++++++++++++++++++++++++++++++----------------
2 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/dlls/itss/Makefile.in b/dlls/itss/Makefile.in
index ccde6c2..1a07a66 100644
--- a/dlls/itss/Makefile.in
+++ b/dlls/itss/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = itss.dll
-IMPORTS = urlmon ole32 user32 advapi32 kernel32 ntdll
+IMPORTS = urlmon shlwapi ole32 user32 advapi32 kernel32 ntdll
EXTRALIBS = -luuid
EXTRADEFS = -DCOM_NO_WINDOWS_H
diff --git a/dlls/itss/protocol.c b/dlls/itss/protocol.c
index fe7e3c8..357476d 100644
--- a/dlls/itss/protocol.c
+++ b/dlls/itss/protocol.c
@@ -23,8 +23,10 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
+#include "winreg.h"
#include "ole2.h"
#include "urlmon.h"
+#include "shlwapi.h"
#include "itsstor.h"
#include "chm_lib.h"
@@ -135,8 +137,8 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
ITSProtocol *This = PROTOCOL_THIS(iface);
BINDINFO bindinfo;
DWORD bindf = 0, len;
- LPWSTR file_name, mime;
- LPCWSTR object_name, path;
+ LPWSTR file_name, mime, object_name, p;
+ LPCWSTR ptr;
struct chmFile *chm_file;
struct chmUnitInfo chm_object;
int res;
@@ -147,8 +149,8 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
TRACE("(%p)->(%s %p %p %08x %d)\n", This, debugstr_w(szUrl), pOIProtSink,
pOIBindInfo, grfPI, dwReserved);
- path = skip_schema(szUrl);
- if(!path)
+ ptr = skip_schema(szUrl);
+ if(!ptr)
return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
memset(&bindinfo, 0, sizeof(bindinfo));
@@ -161,39 +163,57 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
ReleaseBindInfo(&bindinfo);
- object_name = strstrW(path, separator);
- if(!object_name) {
+ len = strlenW(ptr)+3;
+ file_name = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+ memcpy(file_name, ptr, len*sizeof(WCHAR));
+ hres = UrlUnescapeW(file_name, NULL, &len, URL_UNESCAPE_INPLACE);
+ if(FAILED(hres)) {
+ WARN("UrlUnescape failed: %08x\n", hres);
+ HeapFree(GetProcessHeap(), 0, file_name);
+ return hres;
+ }
+
+ p = strstrW(file_name, separator);
+ if(!p) {
WARN("invalid url\n");
+ HeapFree(GetProcessHeap(), 0, file_name);
return report_result(pOIProtSink, STG_E_FILENOTFOUND);
}
- len = object_name-path;
- file_name = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));
- memcpy(file_name, path, len*sizeof(WCHAR));
- file_name[len] = 0;
+ *p = 0;
chm_file = chm_openW(file_name);
if(!chm_file) {
WARN("Could not open chm file\n");
+ HeapFree(GetProcessHeap(), 0, file_name);
return report_result(pOIProtSink, STG_E_FILENOTFOUND);
}
- object_name += 2;
+ object_name = p+2;
+ if(*object_name != '/' && *object_name != '\\') {
+ int len = strlenW(object_name)+1;
+ memmove(object_name+1, object_name, len*sizeof(WCHAR));
+ *object_name = '/';
+ }
+
+ for(p=object_name; *p; p++) {
+ if(*p == '\\')
+ *p = '/';
+ }
+
+ TRACE("Resolving %s\n", debugstr_w(object_name));
+
memset(&chm_object, 0, sizeof(chm_object));
res = chm_resolve_object(chm_file, object_name, &chm_object);
- if(res != CHM_RESOLVE_SUCCESS && object_name[0] != '/') {
- WCHAR tmp_obj_name[MAX_PATH];
- tmp_obj_name[0] = '/';
- strcpyW(tmp_obj_name+1, object_name);
- res = chm_resolve_object(chm_file, tmp_obj_name, &chm_object);
- }
if(res != CHM_RESOLVE_SUCCESS) {
WARN("Could not resolve chm object\n");
+ HeapFree(GetProcessHeap(), 0, object_name);
chm_close(chm_file);
return report_result(pOIProtSink, STG_E_FILENOTFOUND);
}
IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST,
- object_name[0] == '/' ? object_name+1 : object_name);
+ strrchrW(object_name, '/')+1);
+ HeapFree(GetProcessHeap(), 0, file_name);
/* FIXME: Native doesn't use FindMimeFromData */
hres = FindMimeFromData(NULL, szUrl, NULL, 0, NULL, 0, &mime, 0);
@@ -211,7 +231,7 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
chm_object.length, chm_object.length);
if(FAILED(hres)) {
WARN("ReportData failed: %08x\n", hres);
- chm_close(chm_file);
+ release_chm(This);
return report_result(pOIProtSink, hres);
}
More information about the wine-cvs
mailing list