From c99ea299f950736802610e18bc47a3b9af14fbc1 Mon Sep 17 00:00:00 2001 From: Apple Date: Mon, 17 Jun 2019 20:50:25 +0000 Subject: [PATCH] dyld-655.1.tar.gz --- dyld3/ClosureBuilder.cpp | 9 +++++++++ dyld3/shared-cache/update_dyld_shared_cache.cpp | 12 +++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dyld3/ClosureBuilder.cpp b/dyld3/ClosureBuilder.cpp index d9dd60c..02bdc85 100644 --- a/dyld3/ClosureBuilder.cpp +++ b/dyld3/ClosureBuilder.cpp @@ -1724,6 +1724,9 @@ const LaunchClosure* ClosureBuilder::makeLaunchClosure(const LoadedFileInfo& fil for (uint32_t i=0; i <= _mainProgLoadIndex; ++i) computeInitOrder(writers[i], i); + if ( _diag.hasError() ) + return nullptr; + // combine all Image objects into one ImageArray ImageArrayWriter imageArrayWriter(_startImageNum, (uint32_t)writers.count()); for (ImageWriter& writer : writers) { @@ -1969,6 +1972,9 @@ const DlopenClosure* ClosureBuilder::makeDlopenClosure(const char* path, const L } } + if ( _diag.hasError() ) + return nullptr; + // check if top image loaded is in shared cache along with everything it depends on *topImageNum = foundTopImage->imageNum; if ( writers.count() == 0 ) { @@ -1982,6 +1988,9 @@ const DlopenClosure* ClosureBuilder::makeDlopenClosure(const char* path, const L // add initializer order into top level Image computeInitOrder(writers[0], (uint32_t)alreadyLoadedList.count()); + if ( _diag.hasError() ) + return nullptr; + // combine all Image objects into one ImageArray ImageArrayWriter imageArrayWriter(_startImageNum, (uint32_t)writers.count()); for (ImageWriter& writer : writers) { diff --git a/dyld3/shared-cache/update_dyld_shared_cache.cpp b/dyld3/shared-cache/update_dyld_shared_cache.cpp index 6a0113e..b906f98 100644 --- a/dyld3/shared-cache/update_dyld_shared_cache.cpp +++ b/dyld3/shared-cache/update_dyld_shared_cache.cpp @@ -359,7 +359,10 @@ static bool dontCache(const std::string& volumePrefix, const std::string& archNa const char* installName = aFile.mh->installName(); if ( (pathsWithDuplicateInstallName.count(aFile.runtimePath) != 0) && (aFile.runtimePath != installName) ) { - if (warn) fprintf(stderr, "update_dyld_shared_cache: warning: %s skipping because of duplicate install name %s\n", archName.c_str(), aFile.runtimePath.c_str()); + // if a dylib moves and a symlink is installed into its place, bom iterator will see both and issue a warning + struct stat statBuf; + bool isSymLink = ( (lstat(aFile.runtimePath.c_str(), &statBuf) == 0) && S_ISLNK(statBuf.st_mode) ); + if (!isSymLink && warn) fprintf(stderr, "update_dyld_shared_cache: warning: %s skipping because of duplicate install name %s\n", archName.c_str(), aFile.runtimePath.c_str()); return true; } @@ -411,8 +414,11 @@ static void pruneCachedDylibs(const std::string& volumePrefix, const std::unorde } for (DyldSharedCache::MappedMachO& aFile : fileSet.dylibsForCache) { - if ( dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, true, skipDylibs) ) - fileSet.otherDylibsAndBundles.push_back(aFile); + if ( dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, true, skipDylibs) ) { + // don't build dlopen closures for symlinks to something in the dyld cache + if ( pathsWithDuplicateInstallName.count(aFile.runtimePath) == 0 ) + fileSet.otherDylibsAndBundles.push_back(aFile); + } } fileSet.dylibsForCache.erase(std::remove_if(fileSet.dylibsForCache.begin(), fileSet.dylibsForCache.end(), [&](const DyldSharedCache::MappedMachO& aFile) { return dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, false, skipDylibs); }), -- 2.7.4