msi [1/5]: Fix use of BSTRs

James Hawkins truiken at gmail.com
Thu Jul 5 19:48:08 CDT 2007


Hi,

Changelog:
* Fix use of BSTRs.

 dlls/msi/install.c     |  113 +++++++++++++++++++++++++++++++++++++++++++-----
 dlls/msi/msiserver.idl |   22 +++++----
 dlls/msi/package.c     |   52 ++++++++++++++++------
 3 files changed, 150 insertions(+), 37 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index cb5f77b..cb88ebb 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -30,6 +30,8 @@ #include "winerror.h"
 #include "wine/debug.h"
 #include "msi.h"
 #include "msidefs.h"
+#include "objbase.h"
+#include "oleauto.h"
 
 #include "msipriv.h"
 #include "msiserver.h"
@@ -73,14 +75,23 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hIns
     if (!package)
     {
         HRESULT hr;
+        BSTR action;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_DoAction( remote_package, (BSTR *)szAction );
+        action = SysAllocString( szAction );
+        if (!action)
+        {
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
 
+        hr = IWineMsiRemotePackage_DoAction( remote_package, action );
+
+        SysFreeString( action );
         IWineMsiRemotePackage_Release( remote_package );
 
         if (FAILED(hr))
@@ -133,14 +144,23 @@ UINT WINAPI MsiSequenceW( MSIHANDLE hIns
     if (!package)
     {
         HRESULT hr;
+        BSTR table;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_Sequence( remote_package, (BSTR *)szTable, iSequenceMode );
+        table = SysAllocString( szTable );
+        if (!table)
+        {
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
+
+        hr = IWineMsiRemotePackage_Sequence( remote_package, table, iSequenceMode );
 
+        SysFreeString( table );
         IWineMsiRemotePackage_Release( remote_package );
 
         if (FAILED(hr))
@@ -211,14 +231,22 @@ static UINT WINAPI MSI_GetTargetPath( MS
         HRESULT hr;
         IWineMsiRemotePackage *remote_package;
         LPWSTR value = NULL;
+        BSTR folder;
         DWORD len;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
+        folder = SysAllocString( szFolder );
+        if (!folder)
+        {
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
+
         len = 0;
-        hr = IWineMsiRemotePackage_GetTargetPath( remote_package, (BSTR *)szFolder,
+        hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder,
                                                   NULL, &len );
         if (FAILED(hr))
             goto done;
@@ -231,7 +259,7 @@ static UINT WINAPI MSI_GetTargetPath( MS
             goto done;
         }
 
-        hr = IWineMsiRemotePackage_GetTargetPath( remote_package, (BSTR *)szFolder,
+        hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder,
                                                   (BSTR *)value, &len);
         if (FAILED(hr))
             goto done;
@@ -240,6 +268,7 @@ static UINT WINAPI MSI_GetTargetPath( MS
 
 done:
         IWineMsiRemotePackage_Release( remote_package );
+        SysFreeString( folder );
         msi_free( value );
 
         if (FAILED(hr))
@@ -327,14 +356,22 @@ static UINT MSI_GetSourcePath( MSIHANDLE
         HRESULT hr;
         IWineMsiRemotePackage *remote_package;
         LPWSTR value = NULL;
+        BSTR folder;
         DWORD len;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
+        folder = SysAllocString( szFolder );
+        if (!folder)
+        {
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
+
         len = 0;
-        hr = IWineMsiRemotePackage_GetSourcePath( remote_package, (BSTR *)szFolder,
+        hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder,
                                                   NULL, &len );
         if (FAILED(hr))
             goto done;
@@ -347,7 +384,7 @@ static UINT MSI_GetSourcePath( MSIHANDLE
             goto done;
         }
 
-        hr = IWineMsiRemotePackage_GetSourcePath( remote_package, (BSTR *)szFolder,
+        hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder,
                                                   (BSTR *)value, &len);
         if (FAILED(hr))
             goto done;
@@ -356,6 +393,7 @@ static UINT MSI_GetSourcePath( MSIHANDLE
 
 done:
         IWineMsiRemotePackage_Release( remote_package );
+        SysFreeString( folder );
         msi_free( value );
 
         if (FAILED(hr))
@@ -546,14 +584,27 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE 
     if (!package)
     {
         HRESULT hr;
+        BSTR folder, path;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_SetTargetPath( remote_package, (BSTR *)szFolder, (BSTR *)szFolderPath );
+        folder = SysAllocString( szFolder );
+        path = SysAllocString( szFolderPath );
+        if (!folder || !path)
+        {
+            SysFreeString(folder);
+            SysFreeString(path);
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
 
+        hr = IWineMsiRemotePackage_SetTargetPath( remote_package, folder, path );
+
+        SysFreeString(folder);
+        SysFreeString(path);
         IWineMsiRemotePackage_Release( remote_package );
 
         if (FAILED(hr))
@@ -751,14 +802,23 @@ UINT WINAPI MsiSetFeatureStateW(MSIHANDL
     if (!package)
     {
         HRESULT hr;
+        BSTR feature;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall);
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_SetFeatureState(remote_package, (BSTR *)szFeature, iState);
+        feature = SysAllocString(szFeature);
+        if (!feature)
+        {
+            IWineMsiRemotePackage_Release(remote_package);
+            return ERROR_OUTOFMEMORY;
+        }
+
+        hr = IWineMsiRemotePackage_SetFeatureState(remote_package, feature, iState);
 
+        SysFreeString(feature);
         IWineMsiRemotePackage_Release(remote_package);
 
         if (FAILED(hr))
@@ -831,15 +891,26 @@ UINT WINAPI MsiGetFeatureStateW(MSIHANDL
     if (!package)
     {
         HRESULT hr;
+        BSTR feature;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall);
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_GetFeatureState(remote_package, (BSTR *)szFeature,
+        feature = SysAllocString(szFeature);
+        if (!feature)
+        {
+            IWineMsiRemotePackage_Release(remote_package);
+            return ERROR_OUTOFMEMORY;
+        }
+
+        hr = IWineMsiRemotePackage_GetFeatureState(remote_package, feature,
                                                    piInstalled, piAction);
 
+        SysFreeString(feature);
+        IWineMsiRemotePackage_Release(remote_package);
+
         if (FAILED(hr))
         {
             if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
@@ -966,14 +1037,23 @@ UINT WINAPI MsiSetComponentStateW(MSIHAN
     if (!package)
     {
         HRESULT hr;
+        BSTR component;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall);
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_SetComponentState(remote_package, (BSTR *)szComponent, iState);
+        component = SysAllocString(szComponent);
+        if (!component)
+        {
+            IWineMsiRemotePackage_Release(remote_package);
+            return ERROR_OUTOFMEMORY;
+        }
+
+        hr = IWineMsiRemotePackage_SetComponentState(remote_package, component, iState);
 
+        SysFreeString(component);
         IWineMsiRemotePackage_Release(remote_package);
 
         if (FAILED(hr))
@@ -1008,15 +1088,26 @@ UINT WINAPI MsiGetComponentStateW(MSIHAN
     if (!package)
     {
         HRESULT hr;
+        BSTR component;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote(hInstall);
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_GetComponentState(remote_package, (BSTR *)szComponent,
+        component = SysAllocString(szComponent);
+        if (!component)
+        {
+            IWineMsiRemotePackage_Release(remote_package);
+            return ERROR_OUTOFMEMORY;
+        }
+
+        hr = IWineMsiRemotePackage_GetComponentState(remote_package, component,
                                                      piInstalled, piAction);
 
+        SysFreeString(component);
+        IWineMsiRemotePackage_Release(remote_package);
+
         if (FAILED(hr))
         {
             if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl
index d31cb22..b8db7dc 100644
--- a/dlls/msi/msiserver.idl
+++ b/dlls/msi/msiserver.idl
@@ -40,19 +40,19 @@ interface IWineMsiRemotePackage : IUnkno
 {
     HRESULT SetMsiHandle( [in] MSIHANDLE handle );
     HRESULT GetActiveDatabase( [out] MSIHANDLE *handle );
-    HRESULT GetProperty( [in] BSTR *property, [out] BSTR *value, [out] DWORD *size );
-    HRESULT SetProperty( [in] BSTR *property, [in] BSTR *value );
+    HRESULT GetProperty( [in] BSTR property, [out] BSTR *value, [out] DWORD *size );
+    HRESULT SetProperty( [in] BSTR property, [in] BSTR value );
     HRESULT ProcessMessage( [in] INSTALLMESSAGE message, [in] MSIHANDLE record );
-    HRESULT DoAction( [in] BSTR *action );
-    HRESULT Sequence( [in] BSTR *table, [in] int sequence );
-    HRESULT GetTargetPath( [in] BSTR *folder, [out] BSTR *value, [out] DWORD *size );
-    HRESULT SetTargetPath( [in] BSTR *folder, [in] BSTR *value );
-    HRESULT GetSourcePath( [in] BSTR *folder, [out] BSTR *value, [out] DWORD *size );
+    HRESULT DoAction( [in] BSTR action );
+    HRESULT Sequence( [in] BSTR table, [in] int sequence );
+    HRESULT GetTargetPath( [in] BSTR folder, [out] BSTR *value, [out] DWORD *size );
+    HRESULT SetTargetPath( [in] BSTR folder, [in] BSTR value );
+    HRESULT GetSourcePath( [in] BSTR folder, [out] BSTR *value, [out] DWORD *size );
     HRESULT GetMode( [in] MSIRUNMODE mode, [out] BOOL *ret );
-    HRESULT GetFeatureState( [in] BSTR *feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
-    HRESULT SetFeatureState( [in] BSTR *feature, [in] INSTALLSTATE state );
-    HRESULT GetComponentState( [in] BSTR *component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
-    HRESULT SetComponentState( [in] BSTR *component, [in] INSTALLSTATE state );
+    HRESULT GetFeatureState( [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
+    HRESULT SetFeatureState( [in] BSTR feature, [in] INSTALLSTATE state );
+    HRESULT GetComponentState( [in] BSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
+    HRESULT SetComponentState( [in] BSTR component, [in] INSTALLSTATE state );
     HRESULT GetLanguage( [out] LANGID *language );
     HRESULT SetInstallLevel( [in] int level );
 }
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 276271b..0bf3460 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1279,15 +1279,28 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE h
     if( !package )
     {
         HRESULT hr;
+        BSTR name, value;
         IWineMsiRemotePackage *remote_package;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
-        hr = IWineMsiRemotePackage_SetProperty( remote_package, (BSTR *)szName, (BSTR *)szValue );
+        name = SysAllocString( szName );
+        value = SysAllocString( szValue );
+        if (!name || !value)
+        {
+            SysFreeString( name );
+            SysFreeString( value );
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
 
-        IWineMsiRemotePackage_Release(remote_package);
+        hr = IWineMsiRemotePackage_SetProperty( remote_package, name, value );
+
+        SysFreeString( name );
+        SysFreeString( value );
+        IWineMsiRemotePackage_Release( remote_package );
 
         if (FAILED(hr))
         {
@@ -1403,14 +1416,22 @@ static UINT MSI_GetProperty( MSIHANDLE h
         HRESULT hr;
         IWineMsiRemotePackage *remote_package;
         LPWSTR value = NULL;
+        BSTR bname;
         DWORD len;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( handle );
         if (!remote_package)
             return ERROR_INVALID_HANDLE;
 
+        bname = SysAllocString( name );
+        if (!bname)
+        {
+            IWineMsiRemotePackage_Release( remote_package );
+            return ERROR_OUTOFMEMORY;
+        }
+
         len = 0;
-        hr = IWineMsiRemotePackage_GetProperty( remote_package, (BSTR *)name, NULL, &len );
+        hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, NULL, &len );
         if (FAILED(hr))
             goto done;
 
@@ -1422,7 +1443,7 @@ static UINT MSI_GetProperty( MSIHANDLE h
             goto done;
         }
 
-        hr = IWineMsiRemotePackage_GetProperty( remote_package, (BSTR *)name, (BSTR *)value, &len );
+        hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, (BSTR *)value, &len );
         if (FAILED(hr))
             goto done;
 
@@ -1431,6 +1452,7 @@ static UINT MSI_GetProperty( MSIHANDLE h
 
 done:
         IWineMsiRemotePackage_Release(remote_package);
+        SysFreeString(bname);
         msi_free(value);
 
         if (FAILED(hr))
@@ -1550,7 +1572,7 @@ HRESULT WINAPI mrp_GetActiveDatabase( IW
     return S_OK;
 }
 
-HRESULT WINAPI mrp_GetProperty( IWineMsiRemotePackage *iface, BSTR *property, BSTR *value, DWORD *size )
+HRESULT WINAPI mrp_GetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR *value, DWORD *size )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r;
@@ -1562,7 +1584,7 @@ HRESULT WINAPI mrp_GetProperty( IWineMsi
     return S_OK;
 }
 
-HRESULT WINAPI mrp_SetProperty( IWineMsiRemotePackage *iface, BSTR *property, BSTR *value )
+HRESULT WINAPI mrp_SetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR value )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiSetPropertyW(This->package, (LPWSTR)property, (LPWSTR)value);
@@ -1576,35 +1598,35 @@ HRESULT WINAPI mrp_ProcessMessage( IWine
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_DoAction( IWineMsiRemotePackage *iface, BSTR *action )
+HRESULT WINAPI mrp_DoAction( IWineMsiRemotePackage *iface, BSTR action )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiDoActionW(This->package, (LPWSTR)action);
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_Sequence( IWineMsiRemotePackage *iface, BSTR *table, int sequence )
+HRESULT WINAPI mrp_Sequence( IWineMsiRemotePackage *iface, BSTR table, int sequence )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiSequenceW(This->package, (LPWSTR)table, sequence);
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_GetTargetPath( IWineMsiRemotePackage *iface, BSTR *folder, BSTR *value, DWORD *size )
+HRESULT WINAPI mrp_GetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR *value, DWORD *size )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiGetTargetPathW(This->package, (LPWSTR)folder, (LPWSTR)value, size);
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_SetTargetPath( IWineMsiRemotePackage *iface, BSTR *folder, BSTR *value)
+HRESULT WINAPI mrp_SetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value)
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiSetTargetPathW(This->package, (LPWSTR)folder, (LPWSTR)value);
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_GetSourcePath( IWineMsiRemotePackage *iface, BSTR *folder, BSTR *value, DWORD *size )
+HRESULT WINAPI mrp_GetSourcePath( IWineMsiRemotePackage *iface, BSTR folder, BSTR *value, DWORD *size )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiGetSourcePathW(This->package, (LPWSTR)folder, (LPWSTR)value, size);
@@ -1618,7 +1640,7 @@ HRESULT WINAPI mrp_GetMode( IWineMsiRemo
     return S_OK;
 }
 
-HRESULT WINAPI mrp_GetFeatureState( IWineMsiRemotePackage *iface, BSTR *feature,
+HRESULT WINAPI mrp_GetFeatureState( IWineMsiRemotePackage *iface, BSTR feature,
                                     INSTALLSTATE *installed, INSTALLSTATE *action )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
@@ -1626,14 +1648,14 @@ HRESULT WINAPI mrp_GetFeatureState( IWin
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_SetFeatureState( IWineMsiRemotePackage *iface, BSTR *feature, INSTALLSTATE state )
+HRESULT WINAPI mrp_SetFeatureState( IWineMsiRemotePackage *iface, BSTR feature, INSTALLSTATE state )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiSetFeatureStateW(This->package, (LPWSTR)feature, state);
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_GetComponentState( IWineMsiRemotePackage *iface, BSTR *component,
+HRESULT WINAPI mrp_GetComponentState( IWineMsiRemotePackage *iface, BSTR component,
                                       INSTALLSTATE *installed, INSTALLSTATE *action )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
@@ -1641,7 +1663,7 @@ HRESULT WINAPI mrp_GetComponentState( IW
     return HRESULT_FROM_WIN32(r);
 }
 
-HRESULT WINAPI mrp_SetComponentState( IWineMsiRemotePackage *iface, BSTR *component, INSTALLSTATE state )
+HRESULT WINAPI mrp_SetComponentState( IWineMsiRemotePackage *iface, BSTR component, INSTALLSTATE state )
 {
     msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
     UINT r = MsiSetFeatureStateW(This->package, (LPWSTR)component, state);
-- 
1.4.1


More information about the wine-patches mailing list