Loading services/core/java/com/android/server/StorageManagerService.java +10 −1 Original line number Diff line number Diff line Loading @@ -3400,11 +3400,20 @@ class StorageManagerService extends IStorageManager.Stub mInstaller.tryMountDataMirror(volumeUuid); } } } catch (RemoteException | Installer.InstallerException e) { } catch (Exception e) { Slog.wtf(TAG, e); // Make sure to re-throw this exception; we must not ignore failure // to prepare the user storage as it could indicate that encryption // wasn't successfully set up. // // Very unfortunately, these errors need to be ignored for broken // users that already existed on-disk from older Android versions. UserManagerInternal umInternal = LocalServices.getService(UserManagerInternal.class); if (umInternal.shouldIgnorePrepareStorageErrors(userId)) { Slog.wtf(TAG, "ignoring error preparing storage for existing user " + userId + "; device may be insecure!"); return; } throw new RuntimeException(e); } } Loading services/core/java/com/android/server/pm/UserManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -312,4 +312,12 @@ public abstract class UserManagerInternal { */ public abstract void setDefaultCrossProfileIntentFilters( @UserIdInt int parentUserId, @UserIdInt int profileUserId); /** * Returns {@code true} if the system should ignore errors when preparing * the storage directories for the user with ID {@code userId}. This will * return {@code false} for all new users; it will only return {@code true} * for users that already existed on-disk from an older version of Android. */ public abstract boolean shouldIgnorePrepareStorageErrors(int userId); } services/core/java/com/android/server/pm/UserManagerService.java +42 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,8 @@ public class UserManagerService extends IUserManager.Stub { private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions"; private static final String TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL = "lastRequestQuietModeEnabledCall"; private static final String TAG_IGNORE_PREPARE_STORAGE_ERRORS = "ignorePrepareStorageErrors"; private static final String ATTR_KEY = "key"; private static final String ATTR_VALUE_TYPE = "type"; private static final String ATTR_MULTIPLE = "m"; Loading Loading @@ -313,6 +315,14 @@ public class UserManagerService extends IUserManager.Stub { private long mLastRequestQuietModeEnabledMillis; /** * {@code true} if the system should ignore errors when preparing the * storage directories for this user. This is {@code false} for all new * users; it will only be {@code true} for users that already existed * on-disk from an older version of Android. */ private boolean mIgnorePrepareStorageErrors; void setLastRequestQuietModeEnabledMillis(long millis) { mLastRequestQuietModeEnabledMillis = millis; } Loading @@ -321,6 +331,14 @@ public class UserManagerService extends IUserManager.Stub { return mLastRequestQuietModeEnabledMillis; } boolean getIgnorePrepareStorageErrors() { return mIgnorePrepareStorageErrors; } void setIgnorePrepareStorageErrors() { mIgnorePrepareStorageErrors = true; } void clearSeedAccountData() { seedAccountName = null; seedAccountType = null; Loading Loading @@ -3177,6 +3195,10 @@ public class UserManagerService extends IUserManager.Stub { serializer.endTag(/* namespace */ null, TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL); } serializer.startTag(/* namespace */ null, TAG_IGNORE_PREPARE_STORAGE_ERRORS); serializer.text(String.valueOf(userData.getIgnorePrepareStorageErrors())); serializer.endTag(/* namespace */ null, TAG_IGNORE_PREPARE_STORAGE_ERRORS); serializer.endTag(null, TAG_USER); serializer.endDocument(); Loading Loading @@ -3286,6 +3308,7 @@ public class UserManagerService extends IUserManager.Stub { Bundle legacyLocalRestrictions = null; RestrictionsSet localRestrictions = null; Bundle globalRestrictions = null; boolean ignorePrepareStorageErrors = true; // default is true for old users final TypedXmlPullParser parser = Xml.resolvePullParser(is); int type; Loading Loading @@ -3364,6 +3387,11 @@ public class UserManagerService extends IUserManager.Stub { if (type == XmlPullParser.TEXT) { lastRequestQuietModeEnabledTimestamp = Long.parseLong(parser.getText()); } } else if (TAG_IGNORE_PREPARE_STORAGE_ERRORS.equals(tag)) { type = parser.next(); if (type == XmlPullParser.TEXT) { ignorePrepareStorageErrors = Boolean.parseBoolean(parser.getText()); } } } } Loading Loading @@ -3391,6 +3419,9 @@ public class UserManagerService extends IUserManager.Stub { userData.persistSeedData = persistSeedData; userData.seedAccountOptions = seedAccountOptions; userData.setLastRequestQuietModeEnabledMillis(lastRequestQuietModeEnabledTimestamp); if (ignorePrepareStorageErrors) { userData.setIgnorePrepareStorageErrors(); } synchronized (mRestrictionsLock) { if (baseRestrictions != null) { Loading Loading @@ -5232,6 +5263,9 @@ public class UserManagerService extends IUserManager.Stub { pw.println(); } } pw.println(" Ignore errors preparing storage: " + userData.getIgnorePrepareStorageErrors()); } } Loading Loading @@ -5721,6 +5755,14 @@ public class UserManagerService extends IUserManager.Stub { UserManagerService.this.setDefaultCrossProfileIntentFilters( profileUserId, userTypeDetails, restrictions, parentUserId); } @Override public boolean shouldIgnorePrepareStorageErrors(int userId) { synchronized (mUsersLock) { UserData userData = mUsers.get(userId); return userData != null && userData.getIgnorePrepareStorageErrors(); } } } /** Loading Loading
services/core/java/com/android/server/StorageManagerService.java +10 −1 Original line number Diff line number Diff line Loading @@ -3400,11 +3400,20 @@ class StorageManagerService extends IStorageManager.Stub mInstaller.tryMountDataMirror(volumeUuid); } } } catch (RemoteException | Installer.InstallerException e) { } catch (Exception e) { Slog.wtf(TAG, e); // Make sure to re-throw this exception; we must not ignore failure // to prepare the user storage as it could indicate that encryption // wasn't successfully set up. // // Very unfortunately, these errors need to be ignored for broken // users that already existed on-disk from older Android versions. UserManagerInternal umInternal = LocalServices.getService(UserManagerInternal.class); if (umInternal.shouldIgnorePrepareStorageErrors(userId)) { Slog.wtf(TAG, "ignoring error preparing storage for existing user " + userId + "; device may be insecure!"); return; } throw new RuntimeException(e); } } Loading
services/core/java/com/android/server/pm/UserManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -312,4 +312,12 @@ public abstract class UserManagerInternal { */ public abstract void setDefaultCrossProfileIntentFilters( @UserIdInt int parentUserId, @UserIdInt int profileUserId); /** * Returns {@code true} if the system should ignore errors when preparing * the storage directories for the user with ID {@code userId}. This will * return {@code false} for all new users; it will only return {@code true} * for users that already existed on-disk from an older version of Android. */ public abstract boolean shouldIgnorePrepareStorageErrors(int userId); }
services/core/java/com/android/server/pm/UserManagerService.java +42 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,8 @@ public class UserManagerService extends IUserManager.Stub { private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions"; private static final String TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL = "lastRequestQuietModeEnabledCall"; private static final String TAG_IGNORE_PREPARE_STORAGE_ERRORS = "ignorePrepareStorageErrors"; private static final String ATTR_KEY = "key"; private static final String ATTR_VALUE_TYPE = "type"; private static final String ATTR_MULTIPLE = "m"; Loading Loading @@ -313,6 +315,14 @@ public class UserManagerService extends IUserManager.Stub { private long mLastRequestQuietModeEnabledMillis; /** * {@code true} if the system should ignore errors when preparing the * storage directories for this user. This is {@code false} for all new * users; it will only be {@code true} for users that already existed * on-disk from an older version of Android. */ private boolean mIgnorePrepareStorageErrors; void setLastRequestQuietModeEnabledMillis(long millis) { mLastRequestQuietModeEnabledMillis = millis; } Loading @@ -321,6 +331,14 @@ public class UserManagerService extends IUserManager.Stub { return mLastRequestQuietModeEnabledMillis; } boolean getIgnorePrepareStorageErrors() { return mIgnorePrepareStorageErrors; } void setIgnorePrepareStorageErrors() { mIgnorePrepareStorageErrors = true; } void clearSeedAccountData() { seedAccountName = null; seedAccountType = null; Loading Loading @@ -3177,6 +3195,10 @@ public class UserManagerService extends IUserManager.Stub { serializer.endTag(/* namespace */ null, TAG_LAST_REQUEST_QUIET_MODE_ENABLED_CALL); } serializer.startTag(/* namespace */ null, TAG_IGNORE_PREPARE_STORAGE_ERRORS); serializer.text(String.valueOf(userData.getIgnorePrepareStorageErrors())); serializer.endTag(/* namespace */ null, TAG_IGNORE_PREPARE_STORAGE_ERRORS); serializer.endTag(null, TAG_USER); serializer.endDocument(); Loading Loading @@ -3286,6 +3308,7 @@ public class UserManagerService extends IUserManager.Stub { Bundle legacyLocalRestrictions = null; RestrictionsSet localRestrictions = null; Bundle globalRestrictions = null; boolean ignorePrepareStorageErrors = true; // default is true for old users final TypedXmlPullParser parser = Xml.resolvePullParser(is); int type; Loading Loading @@ -3364,6 +3387,11 @@ public class UserManagerService extends IUserManager.Stub { if (type == XmlPullParser.TEXT) { lastRequestQuietModeEnabledTimestamp = Long.parseLong(parser.getText()); } } else if (TAG_IGNORE_PREPARE_STORAGE_ERRORS.equals(tag)) { type = parser.next(); if (type == XmlPullParser.TEXT) { ignorePrepareStorageErrors = Boolean.parseBoolean(parser.getText()); } } } } Loading Loading @@ -3391,6 +3419,9 @@ public class UserManagerService extends IUserManager.Stub { userData.persistSeedData = persistSeedData; userData.seedAccountOptions = seedAccountOptions; userData.setLastRequestQuietModeEnabledMillis(lastRequestQuietModeEnabledTimestamp); if (ignorePrepareStorageErrors) { userData.setIgnorePrepareStorageErrors(); } synchronized (mRestrictionsLock) { if (baseRestrictions != null) { Loading Loading @@ -5232,6 +5263,9 @@ public class UserManagerService extends IUserManager.Stub { pw.println(); } } pw.println(" Ignore errors preparing storage: " + userData.getIgnorePrepareStorageErrors()); } } Loading Loading @@ -5721,6 +5755,14 @@ public class UserManagerService extends IUserManager.Stub { UserManagerService.this.setDefaultCrossProfileIntentFilters( profileUserId, userTypeDetails, restrictions, parentUserId); } @Override public boolean shouldIgnorePrepareStorageErrors(int userId) { synchronized (mUsersLock) { UserData userData = mUsers.get(userId); return userData != null && userData.getIgnorePrepareStorageErrors(); } } } /** Loading