Fix convertToModernFd to support /mnt/user paths
Since I72f39d3e35b975f0a386c055cbb10b4d21c21c86, the MediaProvider now always opens FUSE paths when transcoding is required. Those paths start with /mnt/user/ but apps can't access those paths directly so we make the following changes: 1. Call readlink(2) directly (without stat as ParcelFileDescriptor#getFile currently does). 2. Replace /mnt/user/<userid> with /storage paths and use the new /storage path for scanning This also fixes some failing CTS Test: Apps don't ANR when calling MediaMetadataRetriever#setDataSource Test: atest android.appsecurity.cts.ExternalStorageHostTest#testMediaNone29 Bug: 174655855 Fixes: 177860000 Change-Id: Iec48dcb714a47b147e16eae39df783de748960f4
This commit is contained in:
@@ -1442,11 +1442,13 @@ public final class FileUtils {
|
||||
public static FileDescriptor convertToModernFd(FileDescriptor fd) {
|
||||
try {
|
||||
Context context = AppGlobals.getInitialApplication();
|
||||
File realFile = ParcelFileDescriptor.getFile(fd);
|
||||
// /mnt/user paths are not accessible directly so convert to a /storage path
|
||||
String filePath = Os.readlink("/proc/self/fd/" + fd.getInt$()).replace(
|
||||
"/mnt/user/" + UserHandle.myUserId(), "/storage");
|
||||
File realFile = new File(filePath);
|
||||
String fileName = realFile.getName();
|
||||
boolean isCameraVideo = !fileName.startsWith(".") && fileName.endsWith(".mp4")
|
||||
&& contains(CAMERA_DIR_LOWER_CASE, realFile.getAbsolutePath().toLowerCase(
|
||||
Locale.ROOT));
|
||||
&& contains(CAMERA_DIR_LOWER_CASE, filePath.toLowerCase(Locale.ROOT));
|
||||
|
||||
if (!SystemProperties.getBoolean("sys.fuse.transcode_enabled", false)
|
||||
|| UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)
|
||||
@@ -1471,7 +1473,7 @@ public final class FileUtils {
|
||||
Log.i(TAG, "Failed to change to modern format dataSource for: " + realFile);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.w(TAG, "Failed to change to modern format dataSource");
|
||||
Log.w(TAG, "Failed to change to modern format dataSource", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user