Mike McCormack : msi: Avoid a memory leak by freeing actions scripts in one place only.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 2 05:46:48 CST 2006


Module: wine
Branch: master
Commit: f86cfd4088fb0a6d535201e8da9372c1d8257b19
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f86cfd4088fb0a6d535201e8da9372c1d8257b19

Author: Mike McCormack <mike at codeweavers.com>
Date:   Thu Nov  2 18:12:43 2006 +0900

msi: Avoid a memory leak by freeing actions scripts in one place only.

---

 dlls/msi/action.c  |    6 +-----
 dlls/msi/helpers.c |   19 ++++++++++++-------
 dlls/msi/msipriv.h |    1 +
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index a6cb5c2..8e76413 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -1491,14 +1491,10 @@ static UINT execute_script(MSIPACKAGE *p
         ui_actionstart(package, action);
         TRACE("Executing Action (%s)\n",debugstr_w(action));
         rc = ACTION_PerformAction(package, action, TRUE);
-        msi_free(package->script->Actions[script][i]);
         if (rc != ERROR_SUCCESS)
             break;
     }
-    msi_free(package->script->Actions[script]);
-
-    package->script->ActionCount[script] = 0;
-    package->script->Actions[script] = NULL;
+    msi_free_action_script(package, script);
     return rc;
 }
 
diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c
index 83a9f30..acb0f77 100644
--- a/dlls/msi/helpers.c
+++ b/dlls/msi/helpers.c
@@ -384,6 +384,17 @@ UINT schedule_action(MSIPACKAGE *package
    return ERROR_SUCCESS;
 }
 
+void msi_free_action_script(MSIPACKAGE *package, UINT script)
+{
+    int i;
+    for (i = 0; i < package->script->ActionCount[script]; i++)
+        msi_free(package->script->Actions[script][i]);
+
+    msi_free(package->script->Actions[script]);
+    package->script->Actions[script] = NULL;
+    package->script->ActionCount[script] = 0;
+}
+
 static void remove_tracked_tempfiles(MSIPACKAGE* package)
 {
     struct list *item, *cursor;
@@ -571,13 +582,7 @@ void ACTION_free_package_structures( MSI
     if (package->script)
     {
         for (i = 0; i < TOTAL_SCRIPTS; i++)
-        {
-            int j;
-            for (j = 0; j < package->script->ActionCount[i]; j++)
-                msi_free(package->script->Actions[i][j]);
-        
-            msi_free(package->script->Actions[i]);
-        }
+            msi_free_action_script(package, i);
 
         for (i = 0; i < package->script->UniqueActionsCount; i++)
             msi_free(package->script->UniqueActions[i]);
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index fa0c225..2e4f5d2 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -752,6 +752,7 @@ extern MSIFILE *get_loaded_file( MSIPACK
 extern MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir );
 extern int track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path);
 extern UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action);
+extern void msi_free_action_script(MSIPACKAGE *package, UINT script);
 extern LPWSTR build_icon_path(MSIPACKAGE *, LPCWSTR);
 extern LPWSTR build_directory_name(DWORD , ...);
 extern BOOL create_full_pathW(const WCHAR *path);




More information about the wine-cvs mailing list