Merge "RRO: Synchronize access to overlays.list"

This commit is contained in:
Adam Lesinski
2016-10-12 14:52:48 +00:00
committed by Gerrit Code Review
2 changed files with 30 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
#include <dirent.h> #include <dirent.h>
#include <inttypes.h> #include <inttypes.h>
#include <sys/file.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "idmap.h" #include "idmap.h"
@@ -35,16 +36,31 @@ namespace {
bool writePackagesList(const char *filename, const SortedVector<Overlay>& overlayVector) 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) { if (fout == NULL) {
return false; 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) { for (size_t i = 0; i < overlayVector.size(); ++i) {
const Overlay& overlay = overlayVector[i]; const Overlay& overlay = overlayVector[i];
fprintf(fout, "%s %s\n", overlay.apk_path.string(), overlay.idmap_path.string()); 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); fclose(fout);
// Make file world readable since Zygote (running as root) will read // 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); String8 filename = String8(idmap_dir);
filename.appendPath("overlays.list"); filename.appendPath("overlays.list");
if (unlink(filename.string()) != 0 && errno != ENOENT) {
return EXIT_FAILURE;
}
SortedVector<Overlay> overlayVector; SortedVector<Overlay> overlayVector;
const size_t N = overlay_dirs->size(); const size_t N = overlay_dirs->size();

View File

@@ -35,6 +35,9 @@
#include <utils/threads.h> #include <utils/threads.h>
#include <utils/Timers.h> #include <utils/Timers.h>
#include <utils/Trace.h> #include <utils/Trace.h>
#ifndef _WIN32
#include <sys/file.h>
#endif
#include <assert.h> #include <assert.h>
#include <dirent.h> #include <dirent.h>
@@ -767,6 +770,12 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList,
return; return;
} }
#ifndef _WIN32
if (TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_SH)) != 0) {
fclose(fin);
return;
}
#endif
char buf[1024]; char buf[1024];
while (fgets(buf, sizeof(buf), fin)) { while (fgets(buf, sizeof(buf), fin)) {
// format of each line: // format of each line:
@@ -797,6 +806,10 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList,
const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap); const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap);
} }
} }
#ifndef _WIN32
TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN));
#endif
fclose(fin); fclose(fin);
} }