From f12af5e90727869d225f169e7f475695da64bf48 Mon Sep 17 00:00:00 2001 From: Martin Wallgren Date: Tue, 11 Aug 2015 15:10:31 +0200 Subject: RRO: Synchronize access to overlays.list idmap --scan is executed as a part of the pre-loading in ZygoteInit. The pre loading is executed in parallel for each supported architecture (32/64 bit). This will cause a race condition in the creation of the overlays.list file and the idmap files for the system overlays. Apply flock on overlays.list to prevent the file from being thrown away and recreated when it is in use by another Zygote. Bug: 28032298 Change-Id: I51d39f121d207b11181340b68b164b60020f0c61 --- libs/androidfw/AssetManager.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'libs/androidfw/AssetManager.cpp') 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 #include #include +#ifndef _WIN32 +#include +#endif #include #include @@ -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(this)->mZipSet.addOverlay(targetPackagePath, oap); } } + +#ifndef _WIN32 + TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN)); +#endif fclose(fin); } -- cgit v1.2.3-59-g8ed1b