>From 735d6890c6d2a76a97c290abd7ad1ec4b4e84d4c Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov@codeweavers.com>
Date: Thu, 26 Jan 2012 13:42:35 +0300
Subject: [PATCH 2/2] Some tests for ITypeLib::FindName(), corrected parameter validation

---
 dlls/oleaut32/tests/typelib.c |   78 +++++++++++++++++++++++++++++++++++++++-
 dlls/oleaut32/typelib.c       |   45 ++++++++++++++---------
 2 files changed, 103 insertions(+), 20 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index c7c0f93..631f6d8 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -59,6 +59,8 @@ static HRESULT WINAPI (*pRegisterTypeLibForUser)(ITypeLib*,OLECHAR*,OLECHAR*);
 static HRESULT WINAPI (*pUnRegisterTypeLibForUser)(REFGUID,WORD,WORD,LCID,SYSKIND);
 
 static const WCHAR wszStdOle2[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
+static WCHAR wszGUID[] = {'G','U','I','D',0};
+static WCHAR wszguid[] = {'g','u','i','d',0};
 
 static const int is_win64 = sizeof(void *) > sizeof(int);
 
@@ -116,8 +118,6 @@ static void test_TypeComp(void)
     static WCHAR wszUnchecked[] = {'U','n','c','h','e','c','k','e','d',0};
     static WCHAR wszIUnknown[] = {'I','U','n','k','n','o','w','n',0};
     static WCHAR wszFont[] = {'F','o','n','t',0};
-    static WCHAR wszGUID[] = {'G','U','I','D',0};
-    static WCHAR wszguid[] = {'g','u','i','d',0};
     static WCHAR wszStdPicture[] = {'S','t','d','P','i','c','t','u','r','e',0};
     static WCHAR wszOLE_COLOR[] = {'O','L','E','_','C','O','L','O','R',0};
     static WCHAR wszClone[] = {'C','l','o','n','e',0};
@@ -3112,6 +3112,79 @@ static void test_SetVarDocString(void)
     DeleteFileA(filenameA);
 }
 
+static void test_FindName(void)
+{
+    static const WCHAR invalidW[] = {'i','n','v','a','l','i','d',0};
+    WCHAR buffW[100];
+    MEMBERID memid;
+    ITypeInfo *ti;
+    ITypeLib *tl;
+    HRESULT hr;
+    UINT16 c;
+
+    hr = LoadTypeLib(wszStdOle2, &tl);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = ITypeLib_FindName(tl, NULL, 0, NULL, NULL, NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    lstrcpyW(buffW, wszGUID);
+    hr = ITypeLib_FindName(tl, buffW, 0, NULL, NULL, NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    c = 0;
+    ti = (void*)0xdeadbeef;
+    hr = ITypeLib_FindName(tl, buffW, 0, &ti, NULL, &c);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+    ok(c == 0, "got %d\n", c);
+    ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
+
+    c = 1;
+    ti = (void*)0xdeadbeef;
+    hr = ITypeLib_FindName(tl, buffW, 0, &ti, NULL, &c);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+    ok(c == 1, "got %d\n", c);
+    ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
+
+    c = 1;
+    memid = 0;
+    ti = (void*)0xdeadbeef;
+    hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+    ok(memid == -1, "got %d\n", memid);
+    ok(!lstrcmpW(buffW, wszGUID), "got %s\n", wine_dbgstr_w(buffW));
+    ok(c == 1, "got %d\n", c);
+    ITypeInfo_Release(ti);
+
+    c = 1;
+    memid = 0;
+    lstrcpyW(buffW, wszguid);
+    ti = (void*)0xdeadbeef;
+    hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine {
+    ok(memid == -1, "got %d\n", memid);
+    ok(!lstrcmpW(buffW, wszGUID), "got %s\n", wine_dbgstr_w(buffW));
+    ok(c == 1, "got %d\n", c);
+}
+    if (c == 1)
+        ITypeInfo_Release(ti);
+
+    c = 1;
+    memid = -1;
+    lstrcpyW(buffW, invalidW);
+    ti = (void*)0xdeadbeef;
+    hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(memid == -1, "got %d\n", memid);
+    ok(!lstrcmpW(buffW, invalidW), "got %s\n", wine_dbgstr_w(buffW));
+    ok(c == 0, "got %d\n", c);
+    ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
+
+    ITypeLib_Release(tl);
+}
+
 START_TEST(typelib)
 {
     const char *filename;
@@ -3131,6 +3204,7 @@ START_TEST(typelib)
     test_SetVarHelpContext();
     test_SetFuncAndParamNames();
     test_SetVarDocString();
+    test_FindName();
 
     if ((filename = create_test_typelib(2)))
     {
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 1cab886..07e294b 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -4587,31 +4587,41 @@ ITypeLib2_fnIsName_exit:
  */
 static HRESULT WINAPI ITypeLib2_fnFindName(
 	ITypeLib2 *iface,
-	LPOLESTR szNameBuf,
-	ULONG lHashVal,
+	LPOLESTR name,
+	ULONG hash,
 	ITypeInfo **ppTInfo,
-	MEMBERID *rgMemId,
-	UINT16 *pcFound)
+	MEMBERID *memid,
+	UINT16 *found)
 {
     ITypeLibImpl *This = (ITypeLibImpl *)iface;
-    TLBVarDesc *pVInfo;
-    UINT tic, fdc, pc, count = 0;
-    UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR);
+    UINT tic, count = 0;
+    UINT len;
 
-    for(tic = 0; tic < This->TypeInfoCount; ++tic){
+    TRACE("(%p)->(%s %u %p %p %p)\n", This, debugstr_w(name), hash, ppTInfo, memid, found);
+
+    if ((!name && hash == 0) || !ppTInfo || !memid || !found)
+        return E_INVALIDARG;
+
+    len = (lstrlenW(name) + 1)*sizeof(WCHAR);
+    for(tic = 0; tic < This->TypeInfoCount; ++tic) {
         ITypeInfoImpl *pTInfo = This->typeinfos[tic];
-        if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnFindName_exit;
+        TLBVarDesc *var;
+        UINT fdc;
+
+        if(!memcmp(name, pTInfo->Name, len)) goto ITypeLib2_fnFindName_exit;
         for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) {
-            TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc];
-            if(!memcmp(szNameBuf,pFInfo->Name,nNameBufLen)) goto ITypeLib2_fnFindName_exit;
-            for(pc = 0;pc < pFInfo->funcdesc.cParams; pc++) {
-                if(!memcmp(szNameBuf,pFInfo->pParamDesc[pc].Name,nNameBufLen))
+            TLBFuncDesc *func = &pTInfo->funcdescs[fdc];
+            UINT pc;
+
+            if(!memcmp(name, func->Name, len)) goto ITypeLib2_fnFindName_exit;
+            for(pc = 0; pc < func->funcdesc.cParams; pc++) {
+                if(!memcmp(name, func->pParamDesc[pc].Name, len))
                     goto ITypeLib2_fnFindName_exit;
             }
         }
 
-        pVInfo = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->TypeAttr.cVars, szNameBuf);
-        if(pVInfo)
+        var = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->TypeAttr.cVars, name);
+        if (var)
             goto ITypeLib2_fnFindName_exit;
 
         continue;
@@ -4620,10 +4630,9 @@ ITypeLib2_fnFindName_exit:
         ppTInfo[count]=(LPTYPEINFO)pTInfo;
         count++;
     }
-    TRACE("(%p)slow! search for %d with %s: found %d TypeInfos!\n",
-          This, *pcFound, debugstr_w(szNameBuf), count);
+    TRACE("found %d typeinfos\n", count);
 
-    *pcFound = count;
+    *found = count;
 
     return S_OK;
 }
-- 
1.5.6.5

