[PATCH] oledb32: Allow case-insensitive match for Provider keyword

Nikolay Sivov nsivov at codeweavers.com
Tue Nov 3 15:27:34 CST 2015


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/oledb32/datainit.c       | 27 +++++++++++++++++++++++++--
 dlls/oledb32/tests/database.c |  9 +++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c
index 3a76e0b..1ba0cb1 100644
--- a/dlls/oledb32/datainit.c
+++ b/dlls/oledb32/datainit.c
@@ -413,7 +413,7 @@ static HRESULT parse_init_string(const WCHAR *initstring, struct dbprops *props)
         if (scol) scol++;
         start = scol;
 
-        if (!strcmpW(name, providerW))
+        if (!strcmpiW(name, providerW))
         {
             SysFreeString(name);
             SysFreeString(value);
@@ -548,6 +548,29 @@ static void datasource_release(BOOL created, IUnknown **datasource)
     *datasource = NULL;
 }
 
+static inline WCHAR *strdupW(const WCHAR *src)
+{
+    WCHAR *dest;
+    if (!src) return NULL;
+    dest = heap_alloc((strlenW(src)+1)*sizeof(WCHAR));
+    if (dest)
+        strcpyW(dest, src);
+    return dest;
+}
+
+static WCHAR *strstriW(const WCHAR *str, const WCHAR *sub)
+{
+    LPWSTR strlower, sublower, r;
+    strlower = CharLowerW(strdupW(str));
+    sublower = CharLowerW(strdupW(sub));
+    r = strstrW(strlower, sublower);
+    if (r)
+        r = (LPWSTR)str + (r - strlower);
+    heap_free(strlower);
+    heap_free(sublower);
+    return r;
+}
+
 static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *outer, DWORD clsctx,
                                 LPWSTR initstring, REFIID riid, IUnknown **datasource)
 {
@@ -565,7 +588,7 @@ static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *o
 
     /* first get provider name */
     provclsid = IID_NULL;
-    if (initstring && (prov = strstrW(initstring, providerW)))
+    if (initstring && (prov = strstriW(initstring, providerW)))
     {
         WCHAR *start, *progid;
         int len;
diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c
index 5393a91..483454e 100644
--- a/dlls/oledb32/tests/database.c
+++ b/dlls/oledb32/tests/database.c
@@ -382,6 +382,8 @@ static void test_initializationstring(void)
 {
     static const WCHAR initstring_msdasql[] = {'P','r','o','v','i','d','e','r','=','M','S','D','A','S','Q','L','.','1',';',
          'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y', 0};
+    static const WCHAR initstring_msdasql2[] = {'p','R','o','V','i','D','e','R','=','M','S','D','A','S','Q','L','.','1',';',
+         'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y', 0};
     static const WCHAR initstring_sqloledb[] = {'P','r','o','v','i','d','e','r','=','S','Q','L','O','L','E','D','B','.','1',';',
          'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y', 0};
     IDataInitialize *datainit = NULL;
@@ -414,6 +416,13 @@ static void test_initializationstring(void)
             }
 
             IDBInitialize_Release(dbinit);
+
+            /* mixed casing string */
+            dbinit = NULL;
+            hr = IDataInitialize_GetDataSource(datainit, NULL, CLSCTX_INPROC_SERVER, (WCHAR*)initstring_msdasql2,
+                &IID_IDBInitialize, (IUnknown**)&dbinit);
+            ok(hr == S_OK, "got 0x%08x\n", hr);
+            IDBInitialize_Release(dbinit);
         }
         else
             ok(dbinit == NULL, "got %p\n", dbinit);
-- 
2.6.2




More information about the wine-patches mailing list