summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp29
1 files changed, 14 insertions, 15 deletions
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 05b573ab90b4..c5b3873a004f 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -1094,19 +1094,19 @@ static std::string getAppDataDirName(std::string_view parent_path, std::string_v
fail_fn(CREATE_ERROR("Unexpected error in getAppDataDirName: %s", strerror(errno)));
return nullptr;
}
- // Directory doesn't exist, try to search the name from inode
- DIR* dir = opendir(parent_path.data());
- if (dir == nullptr) {
- fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
- }
- struct dirent* ent;
- while ((ent = readdir(dir))) {
- if (ent->d_ino == ce_data_inode) {
- closedir(dir);
- return ent->d_name;
+ {
+ // Directory doesn't exist, try to search the name from inode
+ std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(parent_path.data()), closedir);
+ if (dir == nullptr) {
+ fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
+ }
+ struct dirent* ent;
+ while ((ent = readdir(dir.get()))) {
+ if (ent->d_ino == ce_data_inode) {
+ return ent->d_name;
+ }
}
}
- closedir(dir);
// Fallback due to b/145989852, ce_data_inode stored in package manager may be corrupted
// if ino_t is 32 bits.
@@ -1117,19 +1117,18 @@ static std::string getAppDataDirName(std::string_view parent_path, std::string_v
fixed_ce_data_inode = ((ce_data_inode >> 32) & LOWER_HALF_WORD_MASK);
}
if (fixed_ce_data_inode != 0) {
- dir = opendir(parent_path.data());
+ std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(parent_path.data()), closedir);
if (dir == nullptr) {
fail_fn(CREATE_ERROR("Failed to opendir %s", parent_path.data()));
}
- while ((ent = readdir(dir))) {
+ struct dirent* ent;
+ while ((ent = readdir(dir.get()))) {
if (ent->d_ino == fixed_ce_data_inode) {
long long d_ino = ent->d_ino;
ALOGW("Fallback success inode %lld -> %lld", ce_data_inode, d_ino);
- closedir(dir);
return ent->d_name;
}
}
- closedir(dir);
}
// Fallback done