diff options
| author | 2025-01-13 15:41:33 -0800 | |
|---|---|---|
| committer | 2025-02-07 15:27:56 -0800 | |
| commit | cb1eb9b9e99e0f2f79982d854d6ad2bc54137d3b (patch) | |
| tree | 504e340a058e2a8647183e742e8c20b67fecc208 | |
| parent | ab9c80e6b30fa39dea5780f74aa717d05c97862e (diff) | |
Fix the DiskReadViolation in GameManagerSettings
* Run the settings read in GameManagerService's handler as
the thread calling from AM doesn't have IO permission.
* Replace the close with try-with-resources for stability,
or we should close in the finally block instead.
* Fix the lazy init loading for the test.
Bug: 322221105
Flag: EXEMPT bugfix
Test: atest GameManagerServiceTests GameManagerServiceSettingsTests
Change-Id: Ic6227a607c71353e5f1c4c28ebe2a24c4c752935
3 files changed, 23 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index c0a97db7275b..767201125e09 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -361,6 +361,14 @@ public final class GameManagerService extends IGameManagerService.Stub { case POPULATE_GAME_MODE_SETTINGS: { removeEqualMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj); final int userId = (int) msg.obj; + synchronized (mLock) { + if (!mSettings.containsKey(userId)) { + GameManagerSettings userSettings = new GameManagerSettings( + Environment.getDataSystemDeDirectory(userId)); + mSettings.put(userId, userSettings); + userSettings.readPersistentDataLocked(); + } + } final String[] packageNames = getInstalledGamePackageNames(userId); updateConfigsForUser(userId, false /*checkGamePackage*/, packageNames); break; @@ -990,8 +998,7 @@ public final class GameManagerService extends IGameManagerService.Stub { @Override public void onUserStarting(@NonNull TargetUser user) { Slog.d(TAG, "Starting user " + user.getUserIdentifier()); - mService.onUserStarting(user, - Environment.getDataSystemDeDirectory(user.getUserIdentifier())); + mService.onUserStarting(user, /*settingDataDirOverride*/ null); } @Override @@ -1596,13 +1603,16 @@ public final class GameManagerService extends IGameManagerService.Stub { } } - void onUserStarting(@NonNull TargetUser user, File settingDataDir) { + void onUserStarting(@NonNull TargetUser user, File settingDataDirOverride) { final int userId = user.getUserIdentifier(); - synchronized (mLock) { - if (!mSettings.containsKey(userId)) { - GameManagerSettings userSettings = new GameManagerSettings(settingDataDir); - mSettings.put(userId, userSettings); - userSettings.readPersistentDataLocked(); + if (settingDataDirOverride != null) { + synchronized (mLock) { + if (!mSettings.containsKey(userId)) { + GameManagerSettings userSettings = new GameManagerSettings( + settingDataDirOverride); + mSettings.put(userId, userSettings); + userSettings.readPersistentDataLocked(); + } } } sendUserMessage(userId, POPULATE_GAME_MODE_SETTINGS, EVENT_ON_USER_STARTING, diff --git a/services/core/java/com/android/server/app/GameManagerSettings.java b/services/core/java/com/android/server/app/GameManagerSettings.java index c57a1f73d7d7..fd4bf2f3ef65 100644 --- a/services/core/java/com/android/server/app/GameManagerSettings.java +++ b/services/core/java/com/android/server/app/GameManagerSettings.java @@ -221,9 +221,7 @@ public class GameManagerSettings { return false; } - try { - final FileInputStream str = mSettingsFile.openRead(); - + try (FileInputStream str = mSettingsFile.openRead()) { final TypedXmlPullParser parser = Xml.resolvePullParser(str); int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -251,7 +249,6 @@ public class GameManagerSettings { + type); } } - str.close(); } catch (XmlPullParserException | java.io.IOException e) { Slog.wtf(TAG, "Error reading game manager settings", e); return false; diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java index 17f5ebb3b02a..7349c5f463a6 100644 --- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java @@ -116,6 +116,10 @@ public class GameManagerServiceSettingsTests { deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir()); } + static { + System.loadLibrary("servicestestjni"); + } + @Test public void testReadGameServiceSettings() { writeOldFiles(); |