diff options
| author | 2016-10-13 14:26:07 +0000 | |
|---|---|---|
| committer | 2016-10-13 14:26:07 +0000 | |
| commit | c68597e6719abe92c349b03372578fcd9bba7e6c (patch) | |
| tree | f136f773afec1a1eb99a7095e0212d03be0bdc6a | |
| parent | 4e7407a80ec46ec4c132af088f779d519b33041a (diff) | |
| parent | 1b9303e8f09af3081223df5ed8a90259d339ebc0 (diff) | |
Merge "RRO: Synchronize access to overlays.list" am: 78382db820
am: 1b9303e8f0
Change-Id: I3d6b143ffc5c08249e9a0be35c39b0e89b364c20
| -rw-r--r-- | cmds/idmap/scan.cpp | 21 | ||||
| -rw-r--r-- | libs/androidfw/AssetManager.cpp | 13 |
2 files changed, 30 insertions, 4 deletions
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp index 6d30f0d0ce34..ab6adfb9475f 100644 --- a/cmds/idmap/scan.cpp +++ b/cmds/idmap/scan.cpp @@ -1,5 +1,6 @@ #include <dirent.h> #include <inttypes.h> +#include <sys/file.h> #include <sys/stat.h> #include "idmap.h" @@ -35,16 +36,31 @@ namespace { bool writePackagesList(const char *filename, const SortedVector<Overlay>& overlayVector) { - FILE* fout = fopen(filename, "w"); + // the file is opened for appending so that it doesn't get truncated + // before we can guarantee mutual exclusion via the flock + FILE* fout = fopen(filename, "a"); if (fout == NULL) { return false; } + if (TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_EX)) != 0) { + fclose(fout); + return false; + } + + if (TEMP_FAILURE_RETRY(ftruncate(fileno(fout), 0)) != 0) { + TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN)); + fclose(fout); + return false; + } + for (size_t i = 0; i < overlayVector.size(); ++i) { const Overlay& overlay = overlayVector[i]; fprintf(fout, "%s %s\n", overlay.apk_path.string(), overlay.idmap_path.string()); } + TEMP_FAILURE_RETRY(fflush(fout)); + TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN)); fclose(fout); // Make file world readable since Zygote (running as root) will read @@ -171,9 +187,6 @@ int idmap_scan(const char *target_package_name, const char *target_apk_path, { String8 filename = String8(idmap_dir); filename.appendPath("overlays.list"); - if (unlink(filename.string()) != 0 && errno != ENOENT) { - return EXIT_FAILURE; - } SortedVector<Overlay> overlayVector; const size_t N = overlay_dirs->size(); diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 8ea25d60cc89..07044d0e9d61 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -35,6 +35,9 @@ #include <utils/threads.h> #include <utils/Timers.h> #include <utils/Trace.h> +#ifndef _WIN32 +#include <sys/file.h> +#endif #include <assert.h> #include <dirent.h> @@ -767,6 +770,12 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, return; } +#ifndef _WIN32 + if (TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_SH)) != 0) { + fclose(fin); + return; + } +#endif char buf[1024]; while (fgets(buf, sizeof(buf), fin)) { // format of each line: @@ -797,6 +806,10 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap); } } + +#ifndef _WIN32 + TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN)); +#endif fclose(fin); } |