diff options
4 files changed, 32 insertions, 17 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 5f3432264ca0..b0d020a7e328 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -59,11 +59,10 @@ import android.os.IBinder; import android.os.Looper; import android.os.Process; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; -import android.os.storage.IStorageManager; +import android.os.storage.StorageManager; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -2457,7 +2456,8 @@ class ContextImpl extends Context { * unable to create, they are filtered by replacing with {@code null}. */ private File[] ensureExternalDirsExistOrFilter(File[] dirs) { - File[] result = new File[dirs.length]; + final StorageManager sm = getSystemService(StorageManager.class); + final File[] result = new File[dirs.length]; for (int i = 0; i < dirs.length; i++) { File dir = dirs[i]; if (!dir.exists()) { @@ -2466,15 +2466,8 @@ class ContextImpl extends Context { if (!dir.exists()) { // Failing to mkdir() may be okay, since we might not have // enough permissions; ask vold to create on our behalf. - final IStorageManager storageManager = IStorageManager.Stub.asInterface( - ServiceManager.getService("mount")); try { - final int res = storageManager.mkdirs( - getPackageName(), dir.getAbsolutePath()); - if (res != 0) { - Log.w(TAG, "Failed to ensure " + dir + ": " + res); - dir = null; - } + sm.mkdirs(dir); } catch (Exception e) { Log.w(TAG, "Failed to ensure " + dir + ": " + e); dir = null; diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl index 2ffc7b028d9b..3b53260e5dd7 100644 --- a/core/java/android/os/storage/IStorageManager.aidl +++ b/core/java/android/os/storage/IStorageManager.aidl @@ -112,7 +112,7 @@ interface IStorageManager { * path belongs to a volume managed by vold, and that path is either * external storage data or OBB directory belonging to calling app. */ - int mkdirs(in String callingPkg, in String path) = 34; + void mkdirs(in String callingPkg, in String path) = 34; /** * Determines the type of the encryption password * @return PasswordType diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 0b007ddf50a1..4796712f2d98 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -1123,6 +1123,15 @@ public class StorageManager { return FileUtils.roundStorageSize(Environment.getDataDirectory().getTotalSpace()); } + /** {@hide} */ + public void mkdirs(File file) { + try { + mStorageManager.mkdirs(mContext.getOpPackageName(), file.getAbsolutePath()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @removed */ public @NonNull StorageVolume[] getVolumeList() { return getVolumeList(mContext.getUserId(), 0); diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 3c955eb0f0db..66b3adb68ddd 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2192,6 +2192,11 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); + if (StorageManager.isFileEncryptedNativeOnly()) { + // Not supported on FBE devices + return -1; + } + if (type == StorageManager.CRYPT_TYPE_DEFAULT) { password = ""; } else if (TextUtils.isEmpty(password)) { @@ -2268,6 +2273,11 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); + if (StorageManager.isFileEncryptedNativeOnly()) { + // Not supported on FBE devices + return; + } + try { mVold.fdeSetField(field, contents); return; @@ -2287,6 +2297,11 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); + if (StorageManager.isFileEncryptedNativeOnly()) { + // Not supported on FBE devices + return null; + } + try { return mVold.fdeGetField(field); } catch (Exception e) { @@ -2568,7 +2583,7 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon } @Override - public int mkdirs(String callingPkg, String appPath) { + public void mkdirs(String callingPkg, String appPath) { final int userId = UserHandle.getUserId(Binder.getCallingUid()); final UserEnvironment userEnv = new UserEnvironment(userId); @@ -2581,8 +2596,7 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon try { appFile = new File(appPath).getCanonicalFile(); } catch (IOException e) { - Slog.e(TAG, "Failed to resolve " + appPath + ": " + e); - return -1; + throw new IllegalStateException("Failed to resolve " + appPath + ": " + e); } // Try translating the app path into a vold path, but require that it @@ -2597,9 +2611,8 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon try { mVold.mkdirs(appPath); - return 0; } catch (Exception e) { - Slog.wtf(TAG, e); + throw new IllegalStateException("Failed to prepare " + appPath + ": " + e); } } |