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
diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp
index 878fb2d..5c2ad2d 100644
--- a/cmds/installd/utils.cpp
+++ b/cmds/installd/utils.cpp
@@ -104,11 +104,16 @@
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 {