Use pointers not references for out arguments

Google/Android C++ style requires that arguments passed in for writing
should be pointers, not references, so that it's visible in the caller
that they'll be written to.

Bug: 27566014
Change-Id: I5cd55906cc4b2f61c8b97b223786be0b3ce28862
diff --git a/Ext4Crypt.cpp b/Ext4Crypt.cpp
index 98cb05e..0ade48d 100644
--- a/Ext4Crypt.cpp
+++ b/Ext4Crypt.cpp
@@ -127,18 +127,18 @@
     return std::string((char*)key_ref2, EXT4_KEY_DESCRIPTOR_SIZE);
 }
 
-static bool fill_key(const std::string& key, ext4_encryption_key& ext4_key)
+static bool fill_key(const std::string& key, ext4_encryption_key* ext4_key)
 {
     if (key.size() != EXT4_AES_256_XTS_KEY_SIZE) {
         LOG(ERROR) << "Wrong size key " << key.size();
         return false;
     }
-    static_assert(EXT4_AES_256_XTS_KEY_SIZE <= sizeof(ext4_key.raw),
+    static_assert(EXT4_AES_256_XTS_KEY_SIZE <= sizeof(ext4_key->raw),
                   "Key too long!");
-    ext4_key.mode = EXT4_ENCRYPTION_MODE_AES_256_XTS;
-    ext4_key.size = key.size();
-    memset(ext4_key.raw, 0, sizeof(ext4_key.raw));
-    memcpy(ext4_key.raw, key.data(), key.size());
+    ext4_key->mode = EXT4_ENCRYPTION_MODE_AES_256_XTS;
+    ext4_key->size = key.size();
+    memset(ext4_key->raw, 0, sizeof(ext4_key->raw));
+    memcpy(ext4_key->raw, key.data(), key.size());
     return true;
 }
 
@@ -153,10 +153,10 @@
 }
 
 // Get the keyring we store all keys in
-static bool e4crypt_keyring(key_serial_t& device_keyring)
+static bool e4crypt_keyring(key_serial_t* device_keyring)
 {
-    device_keyring = keyctl_search(KEY_SPEC_SESSION_KEYRING, "keyring", "e4crypt", 0);
-    if (device_keyring == -1) {
+    *device_keyring = keyctl_search(KEY_SPEC_SESSION_KEYRING, "keyring", "e4crypt", 0);
+    if (*device_keyring == -1) {
         PLOG(ERROR) << "Unable to find device keyring";
         return false;
     }
@@ -165,14 +165,14 @@
 
 // Install password into global keyring
 // Return raw key reference for use in policy
-static bool install_key(const std::string &key, std::string &raw_ref)
+static bool install_key(const std::string &key, std::string *raw_ref)
 {
     ext4_encryption_key ext4_key;
-    if (!fill_key(key, ext4_key)) return false;
-    raw_ref = generate_key_ref(ext4_key.raw, ext4_key.size);
-    auto ref = keyname(raw_ref);
+    if (!fill_key(key, &ext4_key)) return false;
+    *raw_ref = generate_key_ref(ext4_key.raw, ext4_key.size);
+    auto ref = keyname(*raw_ref);
     key_serial_t device_keyring;
-    if (!e4crypt_keyring(device_keyring)) return false;
+    if (!e4crypt_keyring(&device_keyring)) return false;
     key_serial_t key_id = add_key("logon", ref.c_str(),
                                   (void*)&ext4_key, sizeof(ext4_key),
                                   device_keyring);
@@ -198,9 +198,9 @@
     if (s_ce_key_raw_refs.count(user_id) != 0) return true;
     const auto ce_key_path = get_ce_key_path(user_id);
     std::string ce_key;
-    if (!android::vold::retrieveKey(ce_key_path, auth, ce_key)) return false;
+    if (!android::vold::retrieveKey(ce_key_path, auth, &ce_key)) return false;
     std::string ce_raw_ref;
-    if (!install_key(ce_key, ce_raw_ref)) return false;
+    if (!install_key(ce_key, &ce_raw_ref)) return false;
     s_ce_keys[user_id] = ce_key;
     s_ce_key_raw_refs[user_id] = ce_raw_ref;
     LOG(DEBUG) << "Installed ce key for user " << user_id;
@@ -216,8 +216,8 @@
     return true;
 }
 
-static bool random_key(std::string &key) {
-    if (android::vold::ReadRandomBytes(EXT4_AES_256_XTS_KEY_SIZE, key) != 0) {
+static bool random_key(std::string *key) {
+    if (android::vold::ReadRandomBytes(EXT4_AES_256_XTS_KEY_SIZE, *key) != 0) {
         // TODO status_t plays badly with PLOG, fix it.
         LOG(ERROR) << "Random read failed";
         return false;
@@ -251,8 +251,8 @@
 
 static bool create_and_install_user_keys(userid_t user_id, bool create_ephemeral) {
     std::string de_key, ce_key;
-    if (!random_key(de_key)) return false;
-    if (!random_key(ce_key)) return false;
+    if (!random_key(&de_key)) return false;
+    if (!random_key(&ce_key)) return false;
     if (create_ephemeral) {
         // If the key should be created as ephemeral, don't store it.
         s_ephemeral_users.insert(user_id);
@@ -265,10 +265,10 @@
                 kEmptyAuthentication, ce_key)) return false;
     }
     std::string de_raw_ref;
-    if (!install_key(de_key, de_raw_ref)) return false;
+    if (!install_key(de_key, &de_raw_ref)) return false;
     s_de_key_raw_refs[user_id] = de_raw_ref;
     std::string ce_raw_ref;
-    if (!install_key(ce_key, ce_raw_ref)) return false;
+    if (!install_key(ce_key, &ce_raw_ref)) return false;
     s_ce_keys[user_id] = ce_key;
     s_ce_key_raw_refs[user_id] = ce_raw_ref;
     LOG(DEBUG) << "Created keys for user " << user_id;
@@ -276,13 +276,13 @@
 }
 
 static bool lookup_key_ref(const std::map<userid_t, std::string> &key_map,
-        userid_t user_id, std::string &raw_ref) {
+        userid_t user_id, std::string *raw_ref) {
     auto refi = key_map.find(user_id);
     if (refi == key_map.end()) {
         LOG(ERROR) << "Cannot find key for " << user_id;
         return false;
     }
-    raw_ref = refi->second;
+    *raw_ref = refi->second;
     return true;
 }
 
@@ -327,9 +327,9 @@
         if (s_de_key_raw_refs.count(user_id) == 0) {
             auto key_path = de_dir + "/" + entry->d_name;
             std::string key;
-            if (!android::vold::retrieveKey(key_path, kEmptyAuthentication, key)) return false;
+            if (!android::vold::retrieveKey(key_path, kEmptyAuthentication, &key)) return false;
             std::string raw_ref;
-            if (!install_key(key, raw_ref)) return false;
+            if (!install_key(key, &raw_ref)) return false;
             s_de_key_raw_refs[user_id] = raw_ref;
             LOG(DEBUG) << "Installed de key for user " << user_id;
         }
@@ -351,16 +351,16 @@
     std::string device_key;
     if (path_exists(device_key_path)) {
         if (!android::vold::retrieveKey(device_key_path,
-                kEmptyAuthentication, device_key)) return false;
+                kEmptyAuthentication, &device_key)) return false;
     } else {
         LOG(INFO) << "Creating new key";
-        if (!random_key(device_key)) return false;
+        if (!random_key(&device_key)) return false;
         if (!store_key(device_key_path, device_key_temp,
                 kEmptyAuthentication, device_key)) return false;
     }
 
     std::string device_key_ref;
-    if (!install_key(device_key, device_key_ref)) {
+    if (!install_key(device_key, &device_key_ref)) {
         LOG(ERROR) << "Failed to install device key";
         return false;
     }
@@ -434,7 +434,7 @@
 static bool evict_key(const std::string &raw_ref) {
     auto ref = keyname(raw_ref);
     key_serial_t device_keyring;
-    if (!e4crypt_keyring(device_keyring)) return false;
+    if (!e4crypt_keyring(&device_keyring)) return false;
     auto key_serial = keyctl_search(device_keyring, "logon", ref.c_str(), 0);
     if (keyctl_revoke(key_serial) != 0) {
         PLOG(ERROR) << "Failed to revoke key with serial " << key_serial << " ref " << ref;
@@ -452,9 +452,9 @@
     bool success = true;
     s_ce_keys.erase(user_id);
     std::string raw_ref;
-    success &= lookup_key_ref(s_ce_key_raw_refs, user_id, raw_ref) && evict_key(raw_ref);
+    success &= lookup_key_ref(s_ce_key_raw_refs, user_id, &raw_ref) && evict_key(raw_ref);
     s_ce_key_raw_refs.erase(user_id);
-    success &= lookup_key_ref(s_de_key_raw_refs, user_id, raw_ref) && evict_key(raw_ref);
+    success &= lookup_key_ref(s_de_key_raw_refs, user_id, &raw_ref) && evict_key(raw_ref);
     s_de_key_raw_refs.erase(user_id);
     auto it = s_ephemeral_users.find(user_id);
     if (it != s_ephemeral_users.end()) {
@@ -496,12 +496,12 @@
     return true;
 }
 
-static bool parse_hex(const char *hex, std::string &result) {
+static bool parse_hex(const char *hex, std::string *result) {
     if (strcmp("!", hex) == 0) {
-        result = "";
+        *result = "";
         return true;
     }
-    if (android::vold::HexToStr(hex, result) != 0) {
+    if (android::vold::HexToStr(hex, *result) != 0) {
         LOG(ERROR) << "Invalid FBE hex string"; // Don't log the string for security reasons
         return false;
     }
@@ -515,9 +515,9 @@
     if (!e4crypt_is_native()) return true;
     if (s_ephemeral_users.count(user_id) != 0) return true;
     std::string token, old_secret, new_secret;
-    if (!parse_hex(token_hex, token)) return false;
-    if (!parse_hex(old_secret_hex, old_secret)) return false;
-    if (!parse_hex(new_secret_hex, new_secret)) return false;
+    if (!parse_hex(token_hex, &token)) return false;
+    if (!parse_hex(old_secret_hex, &old_secret)) return false;
+    if (!parse_hex(new_secret_hex, &new_secret)) return false;
     auto old_auth = old_secret.empty()
         ? kEmptyAuthentication
         : android::vold::KeyAuthentication(token, old_secret);
@@ -532,7 +532,7 @@
     auto ce_key = it->second;
     auto ce_key_path = get_ce_key_path(user_id);
     std::string trial_key;
-    if (!android::vold::retrieveKey(ce_key_path, old_auth, trial_key)) {
+    if (!android::vold::retrieveKey(ce_key_path, old_auth, &trial_key)) {
         LOG(WARNING) << "change_user_key wasn't given enough info to reconstruct the key";
     } else if (ce_key != trial_key) {
         LOG(WARNING) << "Reconstructed key != stored key";
@@ -553,8 +553,8 @@
             return true;
         }
         std::string token, secret;
-        if (!parse_hex(token_hex, token)) return false;
-        if (!parse_hex(secret_hex, secret)) return false;
+        if (!parse_hex(token_hex, &token)) return false;
+        if (!parse_hex(secret_hex, &secret)) return false;
         android::vold::KeyAuthentication auth(token, secret);
         if (!read_and_install_user_ce_key(user_id, auth)) {
             LOG(ERROR) << "Couldn't read key for " << user_id;
@@ -621,7 +621,7 @@
 
         if (e4crypt_is_native()) {
             std::string de_raw_ref;
-            if (!lookup_key_ref(s_de_key_raw_refs, user_id, de_raw_ref)) return false;
+            if (!lookup_key_ref(s_de_key_raw_refs, user_id, &de_raw_ref)) return false;
             if (!ensure_policy(de_raw_ref, system_de_path)) return false;
             if (!ensure_policy(de_raw_ref, misc_de_path)) return false;
             if (!ensure_policy(de_raw_ref, user_de_path)) return false;
@@ -643,7 +643,7 @@
 
         if (e4crypt_is_native()) {
             std::string ce_raw_ref;
-            if (!lookup_key_ref(s_ce_key_raw_refs, user_id, ce_raw_ref)) return false;
+            if (!lookup_key_ref(s_ce_key_raw_refs, user_id, &ce_raw_ref)) return false;
             if (!ensure_policy(ce_raw_ref, system_ce_path)) return false;
             if (!ensure_policy(ce_raw_ref, misc_ce_path)) return false;
             if (!ensure_policy(ce_raw_ref, media_ce_path)) return false;