diff --git a/FsCrypt.cpp b/FsCrypt.cpp index 9189953..ebb4640 100644 --- a/FsCrypt.cpp +++ b/FsCrypt.cpp @@ -67,6 +67,7 @@ using android::base::StartsWith; using android::base::StringPrintf; using android::fs_mgr::GetEntryForMountPoint; using android::vold::BuildDataPath; +using android::vold::IsDotOrDotDot; using android::vold::IsFilesystemSupported; using android::vold::kEmptyAuthentication; using android::vold::KeyBuffer; @@ -140,6 +141,7 @@ static std::vector get_ce_key_paths(const std::string& directory_pa } break; } + if (IsDotOrDotDot(*entry)) continue; if (entry->d_type != DT_DIR || entry->d_name[0] != 'c') { LOG(DEBUG) << "Skipping non-key " << entry->d_name; continue; @@ -391,6 +393,7 @@ static bool load_all_de_keys() { } break; } + if (IsDotOrDotDot(*entry)) continue; if (entry->d_type != DT_DIR || !is_numeric(entry->d_name)) { LOG(DEBUG) << "Skipping non-de-key " << entry->d_name; continue; @@ -973,6 +976,7 @@ static bool destroy_volume_keys(const std::string& directory_path, const std::st } break; } + if (IsDotOrDotDot(*entry)) continue; if (entry->d_type != DT_DIR || entry->d_name[0] == '.') { LOG(DEBUG) << "Skipping non-user " << entry->d_name; continue; diff --git a/MoveStorage.cpp b/MoveStorage.cpp index 2447cce..3f636a2 100644 --- a/MoveStorage.cpp +++ b/MoveStorage.cpp @@ -70,9 +70,7 @@ static bool pushBackContents(const std::string& path, std::vector& bool found = false; struct dirent* ent; while ((ent = readdir(dirp.get())) != NULL) { - if ((!strcmp(ent->d_name, ".")) || (!strcmp(ent->d_name, ".."))) { - continue; - } + if (IsDotOrDotDot(*ent)) continue; auto subdir = path + "/" + ent->d_name; found |= pushBackContents(subdir, cmd, searchLevels - 1); } diff --git a/Utils.cpp b/Utils.cpp index 2e28246..7f53a92 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -956,10 +956,7 @@ int64_t calculate_dir_size(int dfd) { int subfd; /* always skip "." and ".." */ - if (name[0] == '.') { - if (name[1] == 0) continue; - if ((name[1] == '.') && (name[2] == 0)) continue; - } + if (IsDotOrDotDot(*de)) continue; subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY | O_CLOEXEC); if (subfd >= 0) { @@ -1256,6 +1253,10 @@ status_t UnmountTree(const std::string& mountPoint) { return OK; } +bool IsDotOrDotDot(const struct dirent& ent) { + return strcmp(ent.d_name, ".") == 0 || strcmp(ent.d_name, "..") == 0; +} + static status_t delete_dir_contents(DIR* dir) { // Shamelessly borrowed from android::installd int dfd = dirfd(dir); @@ -1269,10 +1270,7 @@ static status_t delete_dir_contents(DIR* dir) { const char* name = de->d_name; if (de->d_type == DT_DIR) { /* always skip "." and ".." */ - if (name[0] == '.') { - if (name[1] == 0) continue; - if ((name[1] == '.') && (name[2] == 0)) continue; - } + if (IsDotOrDotDot(*de)) continue; android::base::unique_fd subfd( openat(dfd, name, O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC)); diff --git a/Utils.h b/Utils.h index 5351450..27889c6 100644 --- a/Utils.h +++ b/Utils.h @@ -168,6 +168,8 @@ bool IsVirtioBlkDevice(unsigned int major); status_t UnmountTreeWithPrefix(const std::string& prefix); status_t UnmountTree(const std::string& mountPoint); +bool IsDotOrDotDot(const struct dirent& ent); + status_t DeleteDirContentsAndDir(const std::string& pathname); status_t DeleteDirContents(const std::string& pathname);