diff options
Diffstat (limited to 'toolkit/mozapps/update/updater/updater.cpp')
-rw-r--r-- | toolkit/mozapps/update/updater/updater.cpp | 277 |
1 files changed, 7 insertions, 270 deletions
diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp index f5f71935dc..13d829243f 100644 --- a/toolkit/mozapps/update/updater/updater.cpp +++ b/toolkit/mozapps/update/updater/updater.cpp @@ -53,9 +53,6 @@ #include <algorithm> #include "updatecommon.h" -#ifdef XP_MACOSX -#include "updaterfileutils_osx.h" -#endif // XP_MACOSX #include "mozilla/Compiler.h" #include "mozilla/Types.h" @@ -75,23 +72,6 @@ #define PARENT_WAIT 10000 #endif -#if defined(XP_MACOSX) -// These functions are defined in launchchild_osx.mm -void CleanupElevatedMacUpdate(bool aFailureOccurred); -bool IsOwnedByGroupAdmin(const char* aAppBundle); -bool IsRecursivelyWritable(const char* aPath); -void LaunchChild(int argc, const char** argv); -void LaunchMacPostProcess(const char* aAppBundle); -bool ObtainUpdaterArguments(int* argc, char*** argv); -bool ServeElevatedUpdate(int argc, const char** argv); -void SetGroupOwnershipAndPermissions(const char* aAppBundle); -struct UpdateServerThreadArgs -{ - int argc; - const NS_tchar** argv; -}; -#endif - #ifndef _O_BINARY # define _O_BINARY 0 #endif @@ -106,14 +86,13 @@ struct UpdateServerThreadArgs // We want to use execv to invoke the callback executable on platforms where // we were launched using execv. See nsUpdateDriver.cpp. -#if defined(XP_UNIX) && !defined(XP_MACOSX) +#if defined(XP_UNIX) #define USE_EXECV #endif # define MAYBE_USE_HARD_LINKS 0 -#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) && \ - !defined(XP_MACOSX) +#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) #include "nss.h" #include "prerror.h" #endif @@ -1696,21 +1675,6 @@ PatchFile::Execute() AutoFile ofile(ensure_open(mFile.get(), shouldTruncate ? NS_T("wb+") : NS_T("rb+"), ss.st_mode)); -#elif defined(XP_MACOSX) - AutoFile ofile(ensure_open(mFile.get(), NS_T("wb+"), ss.st_mode)); - // Modified code from FileUtils.cpp - fstore_t store = {F_ALLOCATECONTIG, F_PEOFPOSMODE, 0, header.dlen}; - // Try to get a continous chunk of disk space - rv = fcntl(fileno((FILE *)ofile), F_PREALLOCATE, &store); - if (rv == -1) { - // OK, perhaps we are too fragmented, allocate non-continuous - store.fst_flags = F_ALLOCATEALL; - rv = fcntl(fileno((FILE *)ofile), F_PREALLOCATE, &store); - } - - if (rv != -1) { - ftruncate(fileno((FILE *)ofile), header.dlen); - } #else AutoFile ofile(ensure_open(mFile.get(), NS_T("wb+"), ss.st_mode)); #endif @@ -2091,8 +2055,6 @@ LaunchCallbackApp(const NS_tchar *workingDir, #if defined(USE_EXECV) execv(argv[0], argv); -#elif defined(XP_MACOSX) - LaunchChild(argc, (const char**)argv); #elif defined(XP_WIN) WinLaunchChild(argv[0], argc, argv, nullptr); #else @@ -2208,19 +2170,15 @@ CopyInstallDirToDestDir() // These files should not be copied over to the updated app #ifdef XP_WIN #define SKIPLIST_COUNT 3 -#elif XP_MACOSX -#define SKIPLIST_COUNT 0 #else #define SKIPLIST_COUNT 2 #endif copy_recursive_skiplist<SKIPLIST_COUNT> skiplist; -#ifndef XP_MACOSX skiplist.append(0, gInstallDirPath, NS_T("updated")); skiplist.append(1, gInstallDirPath, NS_T("updates/0")); #ifdef XP_WIN skiplist.append(2, gInstallDirPath, NS_T("updated.update_in_progress.lock")); #endif -#endif return ensure_copy_recursive(gInstallDirPath, gWorkingDirPath, skiplist); } @@ -2239,11 +2197,7 @@ ProcessReplaceRequest() // 2. Move newDir to destDir. In case of failure, revert step 1 and abort. // 3. Delete tmpDir (or defer it to the next reboot). -#ifdef XP_MACOSX - NS_tchar destDir[MAXPATHLEN]; - NS_tsnprintf(destDir, sizeof(destDir)/sizeof(destDir[0]), - NS_T("%s/Contents"), gInstallDirPath); -#elif XP_WIN +#if XP_WIN // Windows preserves the case of the file/directory names. We use the // GetLongPathName API in order to get the correct case for the directory // name, so that if the user has used a different case when launching the @@ -2263,13 +2217,8 @@ ProcessReplaceRequest() NS_tchar newDir[MAXPATHLEN]; NS_tsnprintf(newDir, sizeof(newDir)/sizeof(newDir[0]), -#ifdef XP_MACOSX - NS_T("%s/Contents"), - gWorkingDirPath); -#else NS_T("%s.bak/updated"), gInstallDirPath); -#endif // First try to remove the possibly existing temp directory, because if this // directory exists, we will fail to rename destDir. @@ -2307,14 +2256,6 @@ ProcessReplaceRequest() LOG(("Begin moving newDir (" LOG_S ") to destDir (" LOG_S ")", newDir, destDir)); rv = rename_file(newDir, destDir, true); -#ifdef XP_MACOSX - if (rv) { - LOG(("Moving failed. Begin copying newDir (" LOG_S ") to destDir (" LOG_S ")", - newDir, destDir)); - copy_recursive_skiplist<0> skiplist; - rv = ensure_copy_recursive(newDir, destDir, skiplist); - } -#endif if (rv) { LOG(("Moving newDir to destDir failed, err: %d", rv)); LOG(("Now, try to move tmpDir back to destDir")); @@ -2328,7 +2269,7 @@ ProcessReplaceRequest() return rv; } -#if !defined(XP_WIN) && !defined(XP_MACOSX) +#if !defined(XP_WIN) // Platforms that have their updates directory in the installation directory // need to have the last-update.log and backup-update.log files moved from the // old installation directory to the new installation directory. @@ -2362,15 +2303,6 @@ ProcessReplaceRequest() #endif } -#ifdef XP_MACOSX - // On OS X, we we need to remove the staging directory after its Contents - // directory has been moved. - NS_tchar updatedAppDir[MAXPATHLEN]; - NS_tsnprintf(updatedAppDir, sizeof(updatedAppDir)/sizeof(updatedAppDir[0]), - NS_T("%s/Updated.app"), gPatchDirPath); - ensure_remove_recursive(updatedAppDir); -#endif - gSucceeded = true; return 0; @@ -2480,11 +2412,7 @@ UpdateThreadFunc(void *param) NS_tchar updateSettingsPath[MAX_TEXT_LEN]; NS_tsnprintf(updateSettingsPath, sizeof(updateSettingsPath) / sizeof(updateSettingsPath[0]), -#ifdef XP_MACOSX - NS_T("%s/Contents/Resources/update-settings.ini"), -#else NS_T("%s/update-settings.ini"), -#endif gWorkingDirPath); MARChannelStringTable MARStrings; if (ReadMARChannelIDs(updateSettingsPath, &MARStrings) != OK) { @@ -2556,15 +2484,6 @@ UpdateThreadFunc(void *param) if (rv) { LOG(("failed: %d", rv)); } else { -#ifdef XP_MACOSX - // If the update was successful we need to update the timestamp on the - // top-level Mac OS X bundle directory so that Mac OS X's Launch Services - // picks up any major changes when the bundle is updated. - if (!sStagedUpdate && utimes(gInstallDirPath, nullptr) != 0) { - LOG(("Couldn't set access/modification time on application bundle.")); - } -#endif - LOG(("succeeded")); } WriteStatusFile(rv); @@ -2574,34 +2493,11 @@ UpdateThreadFunc(void *param) QuitProgressUI(); } -#ifdef XP_MACOSX -static void -ServeElevatedUpdateThreadFunc(void* param) -{ - UpdateServerThreadArgs* threadArgs = (UpdateServerThreadArgs*)param; - gSucceeded = ServeElevatedUpdate(threadArgs->argc, threadArgs->argv); - if (!gSucceeded) { - WriteStatusFile(ELEVATION_CANCELED); - } - QuitProgressUI(); -} - -void freeArguments(int argc, char** argv) -{ - for (int i = 0; i < argc; i++) { - free(argv[i]); - } - free(argv); -} -#endif - int LaunchCallbackAndPostProcessApps(int argc, NS_tchar** argv, int callbackIndex #ifdef XP_WIN , const WCHAR* elevatedLockFilePath , HANDLE updateLockFileHandle -#elif XP_MACOSX - , bool isElevated #endif ) { @@ -2613,19 +2509,11 @@ int LaunchCallbackAndPostProcessApps(int argc, NS_tchar** argv, } } EXIT_WHEN_ELEVATED(elevatedLockFilePath, updateLockFileHandle, 0); -#elif XP_MACOSX - if (!isElevated) { - if (gSucceeded) { - LaunchMacPostProcess(gInstallDirPath); - } #endif LaunchCallbackApp(argv[5], argc - callbackIndex, argv + callbackIndex); -#ifdef XP_MACOSX - } // if (!isElevated) -#endif /* XP_MACOSX */ } return 0; } @@ -2637,20 +2525,7 @@ int NS_main(int argc, NS_tchar **argv) // argument prior to callbackIndex is the working directory. const int callbackIndex = 6; -#ifdef XP_MACOSX - bool isElevated = - strstr(argv[0], "/Library/PrivilegedHelperTools/org.mozilla.updater") != 0; - if (isElevated) { - if (!ObtainUpdaterArguments(&argc, &argv)) { - // Won't actually get here because ObtainUpdaterArguments will terminate - // the current process on failure. - return 1; - } - } -#endif - -#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) && \ - !defined(XP_MACOSX) +#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) // On Windows and Mac we rely on native APIs to do verifications so we don't // need to initialize NSS at all there. // Otherwise, minimize the amount of NSS we depend on by avoiding all the NSS @@ -2663,13 +2538,7 @@ int NS_main(int argc, NS_tchar **argv) } #endif -#ifdef XP_MACOSX - if (!isElevated) { -#endif - InitProgressUI(&argc, &argv); -#ifdef XP_MACOSX - } -#endif + InitProgressUI(&argc, &argv); // To process an update the updater command line must at a minimum have the // directory path containing the updater.mar file to process as the first @@ -2687,12 +2556,6 @@ int NS_main(int argc, NS_tchar **argv) // launched. if (argc < 4) { fprintf(stderr, "Usage: updater patch-dir install-dir apply-to-dir [wait-pid [callback-working-dir callback-path args...]]\n"); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } @@ -2701,12 +2564,6 @@ int NS_main(int argc, NS_tchar **argv) // directory is invalid don't write the status file. fprintf(stderr, "The patch directory path is not valid for this " \ "application (" LOG_S ")\n", argv[1]); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } // The directory containing the update information. @@ -2716,12 +2573,6 @@ int NS_main(int argc, NS_tchar **argv) WriteStatusFile(INVALID_INSTALL_DIR_PATH_ERROR); fprintf(stderr, "The install directory path is not valid for this " \ "application (" LOG_S ")\n", argv[2]); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } // The directory we're going to update to. @@ -2784,12 +2635,6 @@ int NS_main(int argc, NS_tchar **argv) WriteStatusFile(INVALID_WORKING_DIR_PATH_ERROR); fprintf(stderr, "The working directory path is not valid for this " \ "application (" LOG_S ")\n", argv[3]); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } // The directory we're going to update to. @@ -2808,12 +2653,6 @@ int NS_main(int argc, NS_tchar **argv) WriteStatusFile(INVALID_CALLBACK_PATH_ERROR); fprintf(stderr, "The callback file path is not valid for this " \ "application (" LOG_S ")\n", argv[callbackIndex]); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } @@ -2824,37 +2663,10 @@ int NS_main(int argc, NS_tchar **argv) WriteStatusFile(INVALID_CALLBACK_DIR_ERROR); fprintf(stderr, "The callback file must be located in the " \ "installation directory (" LOG_S ")\n", argv[callbackIndex]); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } } -#ifdef XP_MACOSX - if (!isElevated && !IsRecursivelyWritable(argv[2])) { - // If the app directory isn't recursively writeable, an elevated update is - // required. - UpdateServerThreadArgs threadArgs; - threadArgs.argc = argc; - threadArgs.argv = const_cast<const NS_tchar**>(argv); - - Thread t1; - if (t1.Run(ServeElevatedUpdateThreadFunc, &threadArgs) == 0) { - // Show an indeterminate progress bar while an elevated update is in - // progress. - ShowProgressUI(true); - } - t1.Join(); - - LaunchCallbackAndPostProcessApps(argc, argv, callbackIndex, false); - return gSucceeded ? 0 : 1; - } -#endif - if (EnvHasValue("MOZ_OS_UPDATE")) { sIsOSUpdate = true; putenv(const_cast<char*>("MOZ_OS_UPDATE=")); @@ -2864,12 +2676,6 @@ int NS_main(int argc, NS_tchar **argv) if (!WriteStatusFile("applying")) { LOG(("failed setting status to 'applying'")); -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } @@ -3106,12 +2912,6 @@ int NS_main(int argc, NS_tchar **argv) // Try to create the destination directory if it doesn't exist int rv = NS_tmkdir(gWorkingDirPath, 0755); if (rv != OK && errno != EEXIST) { -#ifdef XP_MACOSX - if (isElevated) { - freeArguments(argc, argv); - CleanupElevatedMacUpdate(true); - } -#endif return 1; } } @@ -3352,11 +3152,7 @@ int NS_main(int argc, NS_tchar **argv) // is an elevated process on OSX. Thread t; if (t.Run(UpdateThreadFunc, nullptr) == 0) { - if (!sStagedUpdate && !sReplaceRequest -#ifdef XP_MACOSX - && !isElevated -#endif - ) { + if (!sStagedUpdate && !sReplaceRequest) { ShowProgressUI(); } } @@ -3393,66 +3189,12 @@ int NS_main(int argc, NS_tchar **argv) } #endif /* XP_WIN */ -#ifdef XP_MACOSX - // When the update is successful remove the precomplete file in the root of - // the application bundle and move the distribution directory from - // Contents/MacOS to Contents/Resources and if both exist delete the - // directory under Contents/MacOS (see Bug 1068439). - if (gSucceeded && !sStagedUpdate) { - NS_tchar oldPrecomplete[MAXPATHLEN]; - NS_tsnprintf(oldPrecomplete, sizeof(oldPrecomplete)/sizeof(oldPrecomplete[0]), - NS_T("%s/precomplete"), gInstallDirPath); - NS_tremove(oldPrecomplete); - - NS_tchar oldDistDir[MAXPATHLEN]; - NS_tsnprintf(oldDistDir, sizeof(oldDistDir)/sizeof(oldDistDir[0]), - NS_T("%s/Contents/MacOS/distribution"), gInstallDirPath); - int rv = NS_taccess(oldDistDir, F_OK); - if (!rv) { - NS_tchar newDistDir[MAXPATHLEN]; - NS_tsnprintf(newDistDir, sizeof(newDistDir)/sizeof(newDistDir[0]), - NS_T("%s/Contents/Resources/distribution"), gInstallDirPath); - rv = NS_taccess(newDistDir, F_OK); - if (!rv) { - LOG(("New distribution directory already exists... removing old " \ - "distribution directory: " LOG_S, oldDistDir)); - rv = ensure_remove_recursive(oldDistDir); - if (rv) { - LOG(("Removing old distribution directory failed - err: %d", rv)); - } - } else { - LOG(("Moving old distribution directory to new location. src: " LOG_S \ - ", dst:" LOG_S, oldDistDir, newDistDir)); - rv = rename_file(oldDistDir, newDistDir, true); - if (rv) { - LOG(("Moving old distribution directory to new location failed - " \ - "err: %d", rv)); - } - } - } - } - - if (isElevated) { - SetGroupOwnershipAndPermissions(gInstallDirPath); - freeArguments(argc, argv); - CleanupElevatedMacUpdate(false); - } else if (IsOwnedByGroupAdmin(gInstallDirPath)) { - // If the group ownership of the Firefox .app bundle was set to the "admin" - // group during a previous elevated update, we need to ensure that all files - // in the bundle have group ownership of "admin" as well as write permission - // for the group to not break updates in the future. - SetGroupOwnershipAndPermissions(gInstallDirPath); - } -#endif /* XP_MACOSX */ - LogFinish(); int retVal = LaunchCallbackAndPostProcessApps(argc, argv, callbackIndex #ifdef XP_WIN , elevatedLockFilePath , updateLockFileHandle -#elif XP_MACOSX - , isElevated #endif ); @@ -3908,13 +3650,8 @@ int AddPreCompleteActions(ActionList *list) return OK; } -#ifdef XP_MACOSX - mozilla::UniquePtr<NS_tchar[]> manifestPath(get_full_path( - NS_T("Contents/Resources/precomplete"))); -#else mozilla::UniquePtr<NS_tchar[]> manifestPath(get_full_path( NS_T("precomplete"))); -#endif NS_tchar *rb = GetManifestContents(manifestPath.get()); if (rb == nullptr) { |