OSDN Git Service

Try to encrypt /data/media/obb but ignore failures
authorPaul Crowley <paulcrowley@google.com>
Thu, 10 Aug 2017 22:24:52 +0000 (15:24 -0700)
committerPaul Crowley <paulcrowley@google.com>
Fri, 18 Aug 2017 21:06:04 +0000 (21:06 +0000)
Bug: 64566063
Test: We test whether it's encrypted by trying to move a file from
/data/unencrypted into it. Used this test to make sure directory was
encrypted before change. Left file in directory, rebooted with change,
tested that it was still unencrypted. Deleted all files in directory,
rebooted again, tested that unencrypted files could no longer be moved
into directory.

Change-Id: I50df4949fb495ca8996c8a54e238af56a71f5df9

ext4_utils/ext4_crypt_init_extensions.cpp

index 2bf8801..35a1c21 100644 (file)
@@ -41,6 +41,8 @@
 static const std::string arbitrary_sequence_number = "42";
 static const int vold_command_timeout_ms = 60 * 1000;
 
+static int set_system_de_policy_on(char const* dir);
+
 int e4crypt_install_keyring()
 {
     key_serial_t device_keyring = add_key("keyring", "e4crypt", 0, 0,
@@ -58,11 +60,22 @@ int e4crypt_install_keyring()
 
 int e4crypt_set_directory_policy(const char* dir)
 {
+    if (!dir || strncmp(dir, "/data/", 6)) {
+        return 0;
+    }
+
+    // Special-case /data/media/obb per b/64566063
+    if (strcmp(dir, "/data/media/obb") == 0) {
+        // Try to set policy on this directory, but if it is non-empty this may fail.
+        set_system_de_policy_on(dir);
+        return 0;
+    }
+
     // Only set policy on first level /data directories
     // To make this less restrictive, consider using a policy file.
     // However this is overkill for as long as the policy is simply
     // to apply a global policy to all /data folders created via makedir
-    if (!dir || strncmp(dir, "/data/", 6) || strchr(dir + 6, '/')) {
+    if (strchr(dir + 6, '/')) {
         return 0;
     }
 
@@ -83,7 +96,10 @@ int e4crypt_set_directory_policy(const char* dir)
             return 0;
         }
     }
+    return set_system_de_policy_on(dir);
+}
 
+static int set_system_de_policy_on(char const* dir) {
     std::string ref_filename = std::string("/data") + e4crypt_key_ref;
     std::string policy;
     if (!android::base::ReadFileToString(ref_filename, &policy)) {