diff options
author | 2020-07-09 10:30:33 +0100 | |
---|---|---|
committer | 2020-07-10 14:48:39 +0100 | |
commit | 762bb252fdd1d7856ef51cbeaea2815504082872 (patch) | |
tree | 083abbb5fde578415cceb6c619bdbebc48b85e3f | |
parent | f31fb74bef878f667ed7235fd383024b8f460d15 (diff) |
Ignore case when checking if a given path contains mount.
We used to check this on the node's build path, which should always have
the correct case (changed in I84ec47ef6c5272f476ae4c8d63d21be0aa268db9).
However, there is a small chance that path can also end up with different
lower/upper case. Having the string comparison ignore case works in all
cases.
Bug: 160853399
Test: atest FuseUtilsTest && atest --iterations 100 ScopedStorageHostTest#testCaseInsensitivity
Change-Id: I0ae1aa6b5e619ba1345442a65d15a5f3fd6b1f37
-rw-r--r-- | jni/FuseUtils.cpp | 24 | ||||
-rw-r--r-- | jni/FuseUtilsTest.cpp | 19 | ||||
-rw-r--r-- | jni/include/libfuse_jni/FuseUtils.h | 4 |
3 files changed, 36 insertions, 11 deletions
diff --git a/jni/FuseUtils.cpp b/jni/FuseUtils.cpp index 8d6c35a33..7829888f4 100644 --- a/jni/FuseUtils.cpp +++ b/jni/FuseUtils.cpp @@ -19,21 +19,35 @@ #include <string> #include <vector> +#include "android-base/strings.h" + using std::string; namespace mediaprovider { namespace fuse { bool containsMount(const string& path, const string& userid) { - const string& prefix = "/storage/emulated/" + userid; - std::vector<string> suffixes = {"/Android", "/Android/data", "/Android/obb"}; + // This method is called from lookup, so it's called rather frequently. + // Hence, we avoid concatenating the strings and we use 3 separate suffixes. - if (path.find(prefix) != 0) { + static const string prefix = "/storage/emulated/"; + if (!android::base::StartsWithIgnoreCase(path, prefix)) { return false; } - const string& path_suffix = path.substr(prefix.length()); - return std::find(suffixes.begin(), suffixes.end(), path_suffix) != suffixes.end(); + const string& rest_of_path = path.substr(prefix.length()); + if (!android::base::StartsWithIgnoreCase(rest_of_path, userid)) { + return false; + } + + static const string android_suffix = "/Android"; + static const string data_suffix = "/Android/data"; + static const string obb_suffix = "/Android/obb"; + + const string& path_suffix = rest_of_path.substr(userid.length()); + return android::base::EqualsIgnoreCase(path_suffix, android_suffix) || + android::base::EqualsIgnoreCase(path_suffix, data_suffix) || + android::base::EqualsIgnoreCase(path_suffix, obb_suffix); } } // namespace fuse diff --git a/jni/FuseUtilsTest.cpp b/jni/FuseUtilsTest.cpp index 9d05bc79f..d9d28e618 100644 --- a/jni/FuseUtilsTest.cpp +++ b/jni/FuseUtilsTest.cpp @@ -31,12 +31,21 @@ TEST(FuseUtilsTest, testContainsMount_isTrueForAndroidDataObb) { TEST(FuseUtilsTest, testContainsMount) { EXPECT_FALSE(containsMount("/random/path", "1234")); EXPECT_FALSE(containsMount("/storage/abc-123", "1234")); + EXPECT_FALSE(containsMount("/storage/emulated/1234/Android/data/and/more", "1234")); } -TEST(FuseUtilsTest, testContainsMount_isCaseSensitive) { - EXPECT_FALSE(containsMount("/storage/emulated/1234/android", "1234")); - EXPECT_FALSE(containsMount("/storage/emulated/1234/Android/Data", "1234")); - EXPECT_FALSE(containsMount("/storage/emulated/1234/Android/OBB", "1234")); +TEST(FuseUtilsTest, testContainsMount_isCaseInsensitive) { + EXPECT_TRUE(containsMount("/storage/emulated/1234/android", "1234")); + EXPECT_TRUE(containsMount("/storage/emulated/1234/Android/Data", "1234")); + EXPECT_TRUE(containsMount("/storage/emulated/1234/ANDroid/dATa", "1234")); + EXPECT_TRUE(containsMount("/storage/emulated/1234/ANDROID/OBB", "1234")); + EXPECT_TRUE(containsMount("/Storage/EMULATED/1234/Android/obb", "1234")); +} + +TEST(FuseUtilsTest, testContainsMount_isCaseInsensitiveForUserid) { + EXPECT_TRUE(containsMount("/storage/emulated/UserId/Android", "UserId")); + EXPECT_TRUE(containsMount("/storage/emulated/userid/Android/obb", "Userid")); + EXPECT_TRUE(containsMount("/storage/emulated/Userid/Android/obb", "userid")); } TEST(FuseUtilsTest, testContainsMount_isFalseForPathWithAdditionalSlash) { @@ -45,6 +54,7 @@ TEST(FuseUtilsTest, testContainsMount_isFalseForPathWithAdditionalSlash) { EXPECT_FALSE(containsMount("/storage/emulated/1234/Android/obb/", "1234")); EXPECT_FALSE(containsMount("//storage/emulated/1234/Android", "1234")); + EXPECT_FALSE(containsMount("/storage/emulated//1234/Android/data", "1234")); EXPECT_FALSE(containsMount("/storage/emulated/1234//Android/data", "1234")); } @@ -52,4 +62,5 @@ TEST(FuseUtilsTest, testContainsMount_isFalseForPathWithWrongUserid) { EXPECT_FALSE(containsMount("/storage/emulated/11234/Android", "1234")); EXPECT_FALSE(containsMount("/storage/emulated/0/Android/data", "1234")); EXPECT_FALSE(containsMount("/storage/emulated/12345/Android/obb", "1234")); + EXPECT_FALSE(containsMount("/storage/emulated/1234/Android/obb", "5678")); } diff --git a/jni/include/libfuse_jni/FuseUtils.h b/jni/include/libfuse_jni/FuseUtils.h index 3528ca021..88044db6d 100644 --- a/jni/include/libfuse_jni/FuseUtils.h +++ b/jni/include/libfuse_jni/FuseUtils.h @@ -23,8 +23,8 @@ namespace mediaprovider { namespace fuse { /** - * Returns true if the given path is mounted for the given userid. Mounted paths - * are: + * Returns true if the given path (ignoring case) is mounted for the given + * userid. Mounted paths are: * "/storage/emulated/<userid>/Android" * "/storage/emulated/<userid>/Android/data" * "/storage/emulated/<userid>/Android/obb" * |