summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@android.com> 2016-04-13 13:45:47 -0600
committer Jeff Sharkey <jsharkey@android.com> 2016-04-13 13:45:49 -0600
commit1d992f9f7886f98e46f98430d6c1d061cc31fdb3 (patch)
tree92f936be1a8fef219ae9fc841da057b1486375bc
parentef1081f96d3c3915fe84c505674fbd70170ed284 (diff)
Build target path before closedir().
Otherwise ent->d_name could be cleared out, and we'd aim at the top-level data directory, which has disastrous results when clearing app data. Bug: 28155330 Change-Id: Icf7df835d76816dfbe2894fdae708033df983825
-rw-r--r--cmds/installd/utils.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp
index 878fb2daa8..5c2ad2dcee 100644
--- a/cmds/installd/utils.cpp
+++ b/cmds/installd/utils.cpp
@@ -104,11 +104,16 @@ std::string create_data_user_ce_package_path(const char* volume_uuid, userid_t u
struct dirent* ent;
while ((ent = readdir(dir))) {
if (ent->d_ino == ce_data_inode) {
+ auto resolved = StringPrintf("%s/%s", user_path.c_str(), ent->d_name);
+ if (resolved != fallback) {
+ LOG(DEBUG) << "Resolved path " << resolved << " for inode " << ce_data_inode
+ << " instead of " << fallback;
+ }
closedir(dir);
- return StringPrintf("%s/%s", user_path.c_str(), ent->d_name);
+ return resolved;
}
}
- LOG(WARNING) << "Failed to find inode " << ce_data_inode << " for package " << package_name;
+ LOG(WARNING) << "Failed to resolve inode " << ce_data_inode << "; using " << fallback;
closedir(dir);
return fallback;
} else {