From 7bcf4273696aa5b941add7669c7bc9ef82937fa4 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 2 Nov 2020 15:31:56 -0800 Subject: [PATCH 1/2] Utils: add IsDotOrDotDot() and use it in the appropriate places Change-Id: I704522b26acfb3e7c423d9a14d69ede513b50482 --- MoveStorage.cpp | 4 +--- Utils.cpp | 14 ++++++-------- Utils.h | 2 ++ 3 files changed, 9 insertions(+), 11 deletions(-) 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); From 6b84039847ce8c69abad3714acbc42ad29dd1164 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 2 Nov 2020 15:11:06 -0800 Subject: [PATCH 2/2] FsCrypt: silently skip "." and ".." when loading keys Avoid logging useless messages like: D vold : Skipping non-key . D vold : Skipping non-key .. D vold : Skipping non-de-key . D vold : Skipping non-de-key .. Change-Id: I8d2bd67d554605a5ab9faadd3730870dfe0881f6 --- FsCrypt.cpp | 4 ++++ 1 file changed, 4 insertions(+) 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;