Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb1eb9b9 authored by Xiang Wang's avatar Xiang Wang
Browse files

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
parent ab9c80e6
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -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,15 +1603,18 @@ 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();
        if (settingDataDirOverride != null) {
            synchronized (mLock) {
                if (!mSettings.containsKey(userId)) {
                GameManagerSettings userSettings = new GameManagerSettings(settingDataDir);
                    GameManagerSettings userSettings = new GameManagerSettings(
                            settingDataDirOverride);
                    mSettings.put(userId, userSettings);
                    userSettings.readPersistentDataLocked();
                }
            }
        }
        sendUserMessage(userId, POPULATE_GAME_MODE_SETTINGS, EVENT_ON_USER_STARTING,
                0 /*delayMillis*/);

+1 −4
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -116,6 +116,10 @@ public class GameManagerServiceSettingsTests {
        deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir());
    }

    static {
        System.loadLibrary("servicestestjni");
    }

    @Test
    public void testReadGameServiceSettings() {
        writeOldFiles();