Merge "Sanitize path before querying for ScanFile" into rvc-dev
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 67b7d86..79998b3 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -64,7 +64,10 @@
import static com.android.providers.media.util.FileUtils.extractRelativePathForDirectory;
import static com.android.providers.media.util.FileUtils.extractTopLevelDir;
import static com.android.providers.media.util.FileUtils.extractVolumeName;
+import static com.android.providers.media.util.FileUtils.getAbsoluteSanitizedPath;
import static com.android.providers.media.util.FileUtils.isDownload;
+import static com.android.providers.media.util.FileUtils.sanitizeDisplayName;
+import static com.android.providers.media.util.FileUtils.sanitizePath;
import static com.android.providers.media.util.Logging.LOGV;
import static com.android.providers.media.util.Logging.TAG;
import static com.android.providers.media.util.PermissionUtils.checkPermissionManageExternalStorage;
@@ -2301,34 +2304,6 @@
Trace.endSection();
}
- private static @NonNull String[] sanitizePath(@Nullable String path) {
- if (path == null) {
- return new String[0];
- } else {
- final String[] segments = path.split("/");
- // If the path corresponds to the top level directory, then we return an empty path
- // which denotes the top level directory
- if (segments.length == 0) {
- return new String[] { "" };
- }
- for (int i = 0; i < segments.length; i++) {
- segments[i] = sanitizeDisplayName(segments[i]);
- }
- return segments;
- }
- }
-
- private static @Nullable String sanitizeDisplayName(@Nullable String name) {
- if (name == null) {
- return null;
- } else if (name.startsWith(".")) {
- // The resulting file must not be hidden.
- return FileUtils.buildValidFatFilename("_" + name);
- } else {
- return FileUtils.buildValidFatFilename(name);
- }
- }
-
/**
* Sanity check that any requested {@link MediaColumns#DATA} paths actually
* live on the storage volume being targeted.
@@ -5426,16 +5401,6 @@
}
}
- @Nullable
- private String getAbsoluteSanitizedPath(String path) {
- final String[] pathSegments = sanitizePath(path);
- if (pathSegments.length == 0) {
- return null;
- }
- return path = "/" + String.join("/",
- Arrays.copyOfRange(pathSegments, 1, pathSegments.length));
- }
-
/**
* Calculates the ranges that need to be redacted for the given file and user that wants to
* access the file.
diff --git a/src/com/android/providers/media/scan/ModernMediaScanner.java b/src/com/android/providers/media/scan/ModernMediaScanner.java
index 81a6a34..955c027 100644
--- a/src/com/android/providers/media/scan/ModernMediaScanner.java
+++ b/src/com/android/providers/media/scan/ModernMediaScanner.java
@@ -384,7 +384,8 @@
final Bundle queryArgs = new Bundle();
queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SELECTION,
formatClause + " AND " + dataClause + " AND " + generationClause);
- final String pathEscapedForLike = DatabaseUtils.escapeForLike(mRoot.getAbsolutePath());
+ final String pathEscapedForLike = DatabaseUtils.escapeForLike(
+ FileUtils.getAbsoluteSanitizedPath(mRoot.getAbsolutePath()));
queryArgs.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS,
new String[] {pathEscapedForLike + "/%", pathEscapedForLike});
queryArgs.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER,
diff --git a/src/com/android/providers/media/util/FileUtils.java b/src/com/android/providers/media/util/FileUtils.java
index b247f2e..c9cf1e2 100644
--- a/src/com/android/providers/media/util/FileUtils.java
+++ b/src/com/android/providers/media/util/FileUtils.java
@@ -701,4 +701,49 @@
}
}
}
+
+ /** {@hide} **/
+ @Nullable
+ public static String getAbsoluteSanitizedPath(String path) {
+ final String[] pathSegments = sanitizePath(path);
+ if (pathSegments.length == 0) {
+ return null;
+ }
+ return path = "/" + String.join("/",
+ Arrays.copyOfRange(pathSegments, 1, pathSegments.length));
+ }
+
+ /** {@hide} */
+ public static @NonNull String[] sanitizePath(@Nullable String path) {
+ if (path == null) {
+ return new String[0];
+ } else {
+ final String[] segments = path.split("/");
+ // If the path corresponds to the top level directory, then we return an empty path
+ // which denotes the top level directory
+ if (segments.length == 0) {
+ return new String[] { "" };
+ }
+ for (int i = 0; i < segments.length; i++) {
+ segments[i] = sanitizeDisplayName(segments[i]);
+ }
+ return segments;
+ }
+ }
+
+ /**
+ * Sanitizes given name by appending '_' to make it non-hidden and mutating the file
+ * name to make it valid for a FAT filesystem.
+ * @hide
+ */
+ public static @Nullable String sanitizeDisplayName(@Nullable String name) {
+ if (name == null) {
+ return null;
+ } else if (name.startsWith(".")) {
+ // The resulting file must not be hidden.
+ return buildValidFatFilename("_" + name);
+ } else {
+ return buildValidFatFilename(name);
+ }
+ }
}