From 9951b792b17e57cc8ef22cfa22c7df3d7f24d0d7 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 24 Aug 2017 14:01:25 -0700 Subject: [PATCH] init: do not load persistent properties from temporary /data With full disk encryption, a temporary /data partition is mounted to start a minimum subset of the frameworks. Later, once /data can be decrypted it is mounted again. load_persist_props is called both when the temporary /data partition is mounted and again after the real /data is mounted; this is a mistake. This change checks to see if we're a FDE device and if so, returns the first time load_persist_props is called. Test: boot bullhead (FDE) with and without boot pin and check that persistent properties are loaded Test: boot sailfish (FBE) and check that persistent properties are loaded Change-Id: I6ed725072bdb27d80bfa6575d0a4876b08c6a4bc --- init/property_service.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/init/property_service.cpp b/init/property_service.cpp index e07550a39..f0e4d2e96 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -690,6 +690,17 @@ static void load_override_properties() { * has mounted /data. */ void load_persist_props(void) { + // Devices with FDE have load_persist_props called twice; the first time when the temporary + // /data partition is mounted and then again once /data is truly mounted. We do not want to + // read persistent properties from the temporary /data partition or mark persistent properties + // as having been loaded during the first call, so we return in that case. + std::string crypto_state = android::base::GetProperty("ro.crypto.state", ""); + std::string crypto_type = android::base::GetProperty("ro.crypto.type", ""); + if (crypto_state == "encrypted" && crypto_type == "block") { + static size_t num_calls = 0; + if (++num_calls == 1) return; + } + load_override_properties(); /* Read persistent properties after all default values have been loaded. */ load_persistent_properties();