summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Corina <corinac@google.com> 2020-07-09 10:30:33 +0100
committer Corina <corinac@google.com> 2020-07-10 14:48:39 +0100
commit762bb252fdd1d7856ef51cbeaea2815504082872 (patch)
tree083abbb5fde578415cceb6c619bdbebc48b85e3f
parentf31fb74bef878f667ed7235fd383024b8f460d15 (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.cpp24
-rw-r--r--jni/FuseUtilsTest.cpp19
-rw-r--r--jni/include/libfuse_jni/FuseUtils.h4
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" *