commit b7a65a6dcfc1963fef42b4a0d4b5013dbc8a36ad Author: Kathy Brade brade@pearlcrescent.com Date: Wed Jul 22 15:58:52 2015 -0400
Bug 16236: Windows updater: avoid writing to the registry.
Mozilla moves "in use" files that cannot be deleted during an update to a "tobedeleted" directory and then makes a call to MoveFileEx(..., MOVEFILE_DELAY_UNTIL_REBOOT) to request that the file be deleted later. To avoid writing to the Windows Registry, we simply try to remove the "tobedeleted" directory and its contents during browser startup. --- toolkit/mozapps/update/updater/updater.cpp | 9 ++++++++- toolkit/xre/nsUpdateDriver.cpp | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp index acb610c..6e55fe2 100644 --- a/toolkit/mozapps/update/updater/updater.cpp +++ b/toolkit/mozapps/update/updater/updater.cpp @@ -866,7 +866,7 @@ static int rename_file(const NS_tchar *spath, const NS_tchar *dpath, return OK; }
-#ifdef XP_WIN +#if defined(XP_WIN) && !defined(TOR_BROWSER_UPDATE) // Remove the directory pointed to by path and all of its files and // sub-directories. If a file is in use move it to the tobedeleted directory // and attempt to schedule removal of the file on reboot @@ -1005,6 +1005,8 @@ static int backup_discard(const NS_tchar *path) backup, path)); return WRITE_ERROR; } + +#if !defined(TOR_BROWSER_UPDATE) // The MoveFileEx call to remove the file on OS reboot will fail if the // process doesn't have write access to the HKEY_LOCAL_MACHINE registry key // but this is ok since the installer / uninstaller will delete the @@ -1017,6 +1019,7 @@ static int backup_discard(const NS_tchar *path) LOG(("backup_discard: failed to schedule OS reboot removal of " \ "file: " LOG_S, path)); } +#endif } #else if (rv) @@ -2280,8 +2283,10 @@ ProcessReplaceRequest() if (NS_taccess(deleteDir, F_OK)) { NS_tmkdir(deleteDir, 0755); } +#if !defined(TOR_BROWSER_UPDATE) remove_recursive_on_reboot(tmpDir, deleteDir); #endif +#endif }
#ifdef XP_MACOSX @@ -3360,6 +3365,7 @@ int NS_main(int argc, NS_tchar **argv) if (!sStagedUpdate && !sReplaceRequest && _wrmdir(DELETE_DIR)) { LOG(("NS_main: unable to remove directory: " LOG_S ", err: %d", DELETE_DIR, errno)); +#if !defined(TOR_BROWSER_UPDATE) // The directory probably couldn't be removed due to it containing files // that are in use and will be removed on OS reboot. The call to remove the // directory on OS reboot is done after the calls to remove the files so the @@ -3376,6 +3382,7 @@ int NS_main(int argc, NS_tchar **argv) LOG(("NS_main: failed to schedule OS reboot removal of " \ "directory: " LOG_S, DELETE_DIR)); } +#endif } #endif /* XP_WIN */
diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp index ef4c5fb..085f439 100644 --- a/toolkit/xre/nsUpdateDriver.cpp +++ b/toolkit/xre/nsUpdateDriver.cpp @@ -1111,6 +1111,20 @@ ProcessUpdates(nsIFile *greDir, nsIFile *appDir, nsIFile *updRootDir, bool restart, bool isOSUpdate, nsIFile *osApplyToDir, ProcessType *pid) { +#if defined(XP_WIN) && defined(TOR_BROWSER_UPDATE) + // Try to remove the "tobedeleted" directory which, if present, contains + // files that could not be removed during a previous update (e.g., DLLs + // that were in use and therefore locked by Windows). + nsCOMPtr<nsIFile> deleteDir; + nsresult winrv = appDir->Clone(getter_AddRefs(deleteDir)); + if (NS_SUCCEEDED(winrv)) { + winrv = deleteDir->AppendNative(NS_LITERAL_CSTRING("tobedeleted")); + if (NS_SUCCEEDED(winrv)) { + winrv = deleteDir->Remove(true); + } + } +#endif + nsresult rv;
nsCOMPtr<nsIFile> updatesDir;