diff options
| author | 2016-04-13 13:45:47 -0600 | |
|---|---|---|
| committer | 2016-04-13 13:45:49 -0600 | |
| commit | 1d992f9f7886f98e46f98430d6c1d061cc31fdb3 (patch) | |
| tree | 92f936be1a8fef219ae9fc841da057b1486375bc | |
| parent | ef1081f96d3c3915fe84c505674fbd70170ed284 (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.cpp | 9 |
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 { |