Module: wine Branch: master Commit: f86cfd4088fb0a6d535201e8da9372c1d8257b19 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f86cfd4088fb0a6d535201e8da...
Author: Mike McCormack mike@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);