Author: akhaldi
Date: Sun Sep 17 22:56:37 2017
New Revision: 75892

URL: http://svn.reactos.org/svn/reactos?rev=75892&view=rev
Log:
[OLEAUT32] Sync with Wine Staging 2.16. CORE-13762

8da116d oleaut32: Don't copy uninitialized data.
0dde882 oleaut32: Use variable with the correct type in 
LIST_FOR_EACH_ENTRY_SAFE macro.
840ab7c oleaut32: Simplify VarCat implementation.
538e46a oleaut32: Improve support for IDispatch in VarCat.
cf45f3b oleaut32: Add an arguments check to LoadTypeLibEx.
4be8d83 oleaut32: Make VARIANT_GetLocalisedText() static.

Modified:
    trunk/reactos/dll/win32/oleaut32/tmarshal.c
    trunk/reactos/dll/win32/oleaut32/typelib.c
    trunk/reactos/dll/win32/oleaut32/variant.c
    trunk/reactos/dll/win32/oleaut32/variant.h
    trunk/reactos/dll/win32/oleaut32/vartype.c
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/oleaut32/tmarshal.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/tmarshal.c?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/tmarshal.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/tmarshal.c [iso-8859-1] Sun Sep 17 
22:56:37 2017
@@ -1127,7 +1127,7 @@
                DWORD x;
                hres = xbuf_get(buf,(LPBYTE)&x,sizeof(DWORD));
                if (hres) ERR("Failed to read integer 4 byte\n");
-               memcpy(arg,&x,2);
+               else memcpy(arg,&x,2);
            }
            if (debugout) TRACE_(olerelay)("%04x", *(WORD *)arg);
            return hres;
@@ -1137,7 +1137,7 @@
                DWORD x;
                hres = xbuf_get(buf,(LPBYTE)&x,sizeof(DWORD));
                if (hres) ERR("Failed to read integer 4 byte\n");
-               memcpy(arg,&x,1);
+               else memcpy(arg,&x,1);
            }
            if (debugout) TRACE_(olerelay)("%02x", *(BYTE *)arg);
            return hres;

Modified: trunk/reactos/dll/win32/oleaut32/typelib.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/typelib.c?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/typelib.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/typelib.c  [iso-8859-1] Sun Sep 17 
22:56:37 2017
@@ -4809,10 +4809,9 @@
     if (!ref)
     {
       TLBImpLib *pImpLib, *pImpLibNext;
-      TLBRefType *ref_type;
+      TLBRefType *ref_type, *ref_type_next;
       TLBString *tlbstr, *tlbstr_next;
       TLBGuid *tlbguid, *tlbguid_next;
-      void *cursor2;
       int i;
 
       /* remove cache entry */
@@ -4862,7 +4861,7 @@
           heap_free(pImpLib);
       }
 
-      LIST_FOR_EACH_ENTRY_SAFE(ref_type, cursor2, &This->ref_list, TLBRefType, 
entry)
+      LIST_FOR_EACH_ENTRY_SAFE(ref_type, ref_type_next, &This->ref_list, 
TLBRefType, entry)
       {
           list_remove(&ref_type->entry);
           heap_free(ref_type);

Modified: trunk/reactos/dll/win32/oleaut32/variant.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/variant.c?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/variant.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/variant.c  [iso-8859-1] Sun Sep 17 
22:56:37 2017
@@ -497,6 +497,22 @@
     return SafeArrayCopy(V_ARRAY(ps), &V_ARRAY(pd));
 
   return DISP_E_TYPEMISMATCH;
+}
+
+static HRESULT VARIANT_FetchDispatchValue(LPVARIANT pvDispatch, LPVARIANT 
pValue)
+{
+    HRESULT hres;
+    static DISPPARAMS emptyParams = { NULL, NULL, 0, 0 };
+
+    if ((V_VT(pvDispatch) & VT_TYPEMASK) == VT_DISPATCH) {
+        if (NULL == V_DISPATCH(pvDispatch)) return DISP_E_TYPEMISMATCH;
+        hres = IDispatch_Invoke(V_DISPATCH(pvDispatch), DISPID_VALUE, 
&IID_NULL,
+            LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &emptyParams, pValue,
+            NULL, NULL);
+    } else {
+        hres = DISP_E_TYPEMISMATCH;
+    }
+    return hres;
 }
 
 /******************************************************************************
@@ -2485,23 +2501,21 @@
  */
 HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
 {
-    VARTYPE leftvt,rightvt,resultvt;
+    BSTR left_str = NULL, right_str = NULL;
+    VARTYPE leftvt, rightvt;
     HRESULT hres;
-    static const WCHAR sz_empty[] = {'\0'};
+
+    TRACE("%s,%s,%p)\n", debugstr_variant(left), debugstr_variant(right), out);
+
     leftvt = V_VT(left);
     rightvt = V_VT(right);
 
-    TRACE("%s,%s,%p)\n", debugstr_variant(left), debugstr_variant(right), out);
-
     /* when both left and right are NULL the result is NULL */
     if (leftvt == VT_NULL && rightvt == VT_NULL)
     {
         V_VT(out) = VT_NULL;
         return S_OK;
     }
-
-    hres = S_OK;
-    resultvt = VT_EMPTY;
 
     /* There are many special case for errors and return types */
     if (leftvt == VT_VARIANT && (rightvt == VT_ERROR ||
@@ -2528,7 +2542,7 @@
         rightvt == VT_UINT || rightvt == VT_EMPTY ||
         rightvt == VT_NULL || rightvt == VT_DATE ||
         rightvt == VT_DECIMAL || rightvt == VT_DISPATCH))
-        resultvt = VT_BSTR;
+        hres = S_OK;
     else if (rightvt == VT_ERROR && leftvt < VT_VOID)
         hres = DISP_E_TYPEMISMATCH;
     else if (leftvt == VT_ERROR && (rightvt == VT_DATE ||
@@ -2558,72 +2572,72 @@
     /* if result type is not S_OK, then no need to go further */
     if (hres != S_OK)
     {
-        V_VT(out) = resultvt;
+        V_VT(out) = VT_EMPTY;
         return hres;
     }
-    /* Else proceed with formatting inputs to strings */
+
+    if (leftvt == VT_BSTR)
+        left_str = V_BSTR(left);
     else
     {
-        VARIANT bstrvar_left, bstrvar_right;
-        V_VT(out) = VT_BSTR;
-
-        VariantInit(&bstrvar_left);
-        VariantInit(&bstrvar_right);
-
-        /* Convert left side variant to string */
-        if (leftvt != VT_BSTR)
+        VARIANT converted, *tmp = left;
+
+        VariantInit(&converted);
+        if(leftvt == VT_DISPATCH)
         {
-            /* Fill with empty string for later concat with right side */
-            if (leftvt == VT_NULL)
-            {
-                V_VT(&bstrvar_left) = VT_BSTR;
-                V_BSTR(&bstrvar_left) = SysAllocString(sz_empty);
-            }
-            else
-            {
-                hres = 
VariantChangeTypeEx(&bstrvar_left,left,0,VARIANT_ALPHABOOL|VARIANT_LOCALBOOL,VT_BSTR);
-                if (hres != S_OK) {
-                    VariantClear(&bstrvar_left);
-                    VariantClear(&bstrvar_right);
-                    return hres;
-                }
-            }
+            hres = VARIANT_FetchDispatchValue(left, &converted);
+            if(FAILED(hres))
+                goto failed;
+
+            tmp = &converted;
         }
 
-        /* convert right side variant to string */
-        if (rightvt != VT_BSTR)
+        hres = VariantChangeTypeEx(&converted, tmp, 0, 
VARIANT_ALPHABOOL|VARIANT_LOCALBOOL, VT_BSTR);
+        if (SUCCEEDED(hres))
+            left_str = V_BSTR(&converted);
+        else if (hres != DISP_E_TYPEMISMATCH)
         {
-            /* Fill with empty string for later concat with right side */
-            if (rightvt == VT_NULL)
-            {
-                V_VT(&bstrvar_right) = VT_BSTR;
-                V_BSTR(&bstrvar_right) = SysAllocString(sz_empty);
-            }
-            else
-            {
-                hres = 
VariantChangeTypeEx(&bstrvar_right,right,0,VARIANT_ALPHABOOL|VARIANT_LOCALBOOL,VT_BSTR);
-                if (hres != S_OK) {
-                    VariantClear(&bstrvar_left);
-                    VariantClear(&bstrvar_right);
-                    return hres;
-                }
-            }
+            VariantClear(&converted);
+            goto failed;
         }
-
-        /* Concat the resulting strings together */
-        if (leftvt == VT_BSTR && rightvt == VT_BSTR)
-            VarBstrCat (V_BSTR(left), V_BSTR(right), &V_BSTR(out));
-        else if (leftvt != VT_BSTR && rightvt != VT_BSTR)
-            VarBstrCat (V_BSTR(&bstrvar_left), V_BSTR(&bstrvar_right), 
&V_BSTR(out));
-        else if (leftvt != VT_BSTR && rightvt == VT_BSTR)
-            VarBstrCat (V_BSTR(&bstrvar_left), V_BSTR(right), &V_BSTR(out));
-        else if (leftvt == VT_BSTR && rightvt != VT_BSTR)
-            VarBstrCat (V_BSTR(left), V_BSTR(&bstrvar_right), &V_BSTR(out));
-
-        VariantClear(&bstrvar_left);
-        VariantClear(&bstrvar_right);
-        return S_OK;
-    }
+    }
+
+    if (rightvt == VT_BSTR)
+        right_str = V_BSTR(right);
+    else
+    {
+        VARIANT converted, *tmp = right;
+
+        VariantInit(&converted);
+        if(rightvt == VT_DISPATCH)
+        {
+            hres = VARIANT_FetchDispatchValue(right, &converted);
+            if(FAILED(hres))
+                goto failed;
+
+            tmp = &converted;
+        }
+
+        hres = VariantChangeTypeEx(&converted, tmp, 0, 
VARIANT_ALPHABOOL|VARIANT_LOCALBOOL, VT_BSTR);
+        if (SUCCEEDED(hres))
+            right_str = V_BSTR(&converted);
+        else if (hres != DISP_E_TYPEMISMATCH)
+        {
+            VariantClear(&converted);
+            goto failed;
+        }
+    }
+
+
+    V_VT(out) = VT_BSTR;
+    hres = VarBstrCat(left_str, right_str, &V_BSTR(out));
+
+failed:
+    if(V_VT(left) != VT_BSTR)
+        SysFreeString(left_str);
+    if(V_VT(right) != VT_BSTR)
+        SysFreeString(right_str);
+    return hres;
 }
 
 
@@ -2847,22 +2861,6 @@
             return E_FAIL;
     }
 #undef _VARCMP
-}
-
-static HRESULT VARIANT_FetchDispatchValue(LPVARIANT pvDispatch, LPVARIANT 
pValue)
-{
-    HRESULT hres;
-    static DISPPARAMS emptyParams = { NULL, NULL, 0, 0 };
-
-    if ((V_VT(pvDispatch) & VT_TYPEMASK) == VT_DISPATCH) {
-        if (NULL == V_DISPATCH(pvDispatch)) return DISP_E_TYPEMISMATCH;
-        hres = IDispatch_Invoke(V_DISPATCH(pvDispatch), DISPID_VALUE, 
&IID_NULL,
-            LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &emptyParams, pValue,
-            NULL, NULL);
-    } else {
-        hres = DISP_E_TYPEMISMATCH;
-    }
-    return hres;
 }
 
 /**********************************************************************

Modified: trunk/reactos/dll/win32/oleaut32/variant.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/variant.h?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/variant.h  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/variant.h  [iso-8859-1] Sun Sep 17 
22:56:37 2017
@@ -113,7 +113,6 @@
 } VARIANT_NUMBER_CHARS;
 
 unsigned int get_type_size(ULONG*, VARTYPE) DECLSPEC_HIDDEN;
-BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *) DECLSPEC_HIDDEN;
 HRESULT VARIANT_ClearInd(VARIANTARG *) DECLSPEC_HIDDEN;
 BOOL get_date_format(LCID, DWORD, const SYSTEMTIME *,
         const WCHAR *, WCHAR *, int) DECLSPEC_HIDDEN;

Modified: trunk/reactos/dll/win32/oleaut32/vartype.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/vartype.c?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/vartype.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/vartype.c  [iso-8859-1] Sun Sep 17 
22:56:37 2017
@@ -6051,7 +6051,7 @@
  * Get a localized string from the resources
  *
  */
-BOOL VARIANT_GetLocalisedText(LANGID langId, DWORD dwId, WCHAR *lpszDest)
+static BOOL VARIANT_GetLocalisedText(LANGID langId, DWORD dwId, WCHAR 
*lpszDest)
 {
   HRSRC hrsrc;
 

Modified: trunk/reactos/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=75892&r1=75891&r2=75892&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sun Sep 17 22:56:37 2017
@@ -141,7 +141,7 @@
 reactos/dll/win32/odbccp32            # Synced to WineStaging-2.9
 reactos/dll/win32/ole32               # Synced to WineStaging-2.16
 reactos/dll/win32/oleacc              # Synced to WineStaging-2.9
-reactos/dll/win32/oleaut32            # Synced to WineStaging-2.9
+reactos/dll/win32/oleaut32            # Synced to WineStaging-2.16
 reactos/dll/win32/olecli32            # Synced to WineStaging-2.9
 reactos/dll/win32/oledlg              # Synced to WineStaging-2.9
 reactos/dll/win32/olepro32            # Synced to WineStaging-2.9


Reply via email to