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

Commit e731681f authored by Dan Sandler's avatar Dan Sandler
Browse files

Skip empty slice permissions files during backup

Test: adb shell bmgr backupnow --monitor-verbose android
  (make sure this finishes quickly & does not get stuck
  in an infinite loop)
Test: atest frameworks/base/services/tests/uiservicestests/src/com/android/server/slice
Change-Id: Ieb701c7ed764c005c8a8517a9411edd8c36023f0
Fixes: 120904478
parent 58514eaa
Loading
Loading
Loading
Loading
+13 −7
Original line number Original line Diff line number Diff line
@@ -175,18 +175,24 @@ public class SlicePermissionManager implements DirtyTracker {
                handlePersist();
                handlePersist();
            }
            }
            for (String file : new File(mSliceDir.getAbsolutePath()).list()) {
            for (String file : new File(mSliceDir.getAbsolutePath()).list()) {
                if (file.isEmpty()) continue;
                try (ParserHolder parser = getParser(file)) {
                try (ParserHolder parser = getParser(file)) {
                    Persistable p;
                    Persistable p = null;
                    while (parser.parser.getEventType() != XmlPullParser.START_TAG) {
                    while (parser.parser.getEventType() != XmlPullParser.END_DOCUMENT) {
                        parser.parser.next();
                        if (parser.parser.getEventType() == XmlPullParser.START_TAG) {
                    }
                            if (SliceClientPermissions.TAG_CLIENT.equals(parser.parser.getName())) {
                            if (SliceClientPermissions.TAG_CLIENT.equals(parser.parser.getName())) {
                                p = SliceClientPermissions.createFrom(parser.parser, tracker);
                                p = SliceClientPermissions.createFrom(parser.parser, tracker);
                            } else {
                            } else {
                                p = SliceProviderPermissions.createFrom(parser.parser, tracker);
                                p = SliceProviderPermissions.createFrom(parser.parser, tracker);
                            }
                            }
                            break;
                        }
                        parser.parser.next();
                    }
                    if (p != null) {
                        p.writeTo(out);
                        p.writeTo(out);
                    } else {
                        Slog.w(TAG, "Invalid or empty slice permissions file: " + file);
                    }
                }
                }
            }
            }


+19 −6
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@ package com.android.server.slice;


import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;


import android.content.ContentProvider;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentResolver;
@@ -26,6 +27,7 @@ import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.Log;
import android.util.Xml.Encoding;
import android.util.Xml.Encoding;


import com.android.server.UiServiceTestCase;
import com.android.server.UiServiceTestCase;
@@ -46,10 +48,12 @@ import java.io.IOException;
@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@RunWithLooper
public class SlicePermissionManagerTest extends UiServiceTestCase {
public class SlicePermissionManagerTest extends UiServiceTestCase {
    private static final String TAG = "SlicePerManTest";


    @Test
    @Test
    public void testGrant() {
    public void testGrant() {
        File sliceDir = new File(mContext.getDataDir(), "system/slices");
        File sliceDir = new File(mContext.getCacheDir(), "testGrantSlices");
        Log.v(TAG, "testGrant: slice permissions stored in " + sliceDir.getAbsolutePath());
        SlicePermissionManager permissions = new SlicePermissionManager(mContext,
        SlicePermissionManager permissions = new SlicePermissionManager(mContext,
                TestableLooper.get(this).getLooper(), sliceDir);
                TestableLooper.get(this).getLooper(), sliceDir);
        Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
        Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
@@ -59,11 +63,15 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
        permissions.grantSliceAccess("my.pkg", 0, "provider.pkg", 0, uri);
        permissions.grantSliceAccess("my.pkg", 0, "provider.pkg", 0, uri);


        assertTrue(permissions.hasPermission("my.pkg", 0, uri));
        assertTrue(permissions.hasPermission("my.pkg", 0, uri));

        // Cleanup.
        assertTrue(FileUtils.deleteContentsAndDir(sliceDir));
    }
    }


    @Test
    @Test
    public void testBackup() throws XmlPullParserException, IOException {
    public void testBackup() throws XmlPullParserException, IOException {
        File sliceDir = new File(mContext.getDataDir(), "system/slices");
        File sliceDir = new File(mContext.getCacheDir(), "testBackupSlices");
        Log.v(TAG, "testBackup: slice permissions stored in " + sliceDir.getAbsolutePath());
        Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
        Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
                .authority("authority")
                .authority("authority")
                .path("something").build();
                .path("something").build();
@@ -90,7 +98,10 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
                TestableLooper.get(this).getLooper());
                TestableLooper.get(this).getLooper());
        permissions.readRestore(parser);
        permissions.readRestore(parser);


        assertTrue(permissions.hasFullAccess("com.android.mypkg", 10));
        if (!permissions.hasFullAccess("com.android.mypkg", 10)) {
            fail("com.android.mypkg@10 did not have full access. backup file: "
                    + output.toString());
        }
        assertTrue(permissions.hasPermission("com.android.otherpkg", 0,
        assertTrue(permissions.hasPermission("com.android.otherpkg", 0,
                ContentProvider.maybeAddUserId(uri, 1)));
                ContentProvider.maybeAddUserId(uri, 1)));
        permissions.removePkg("com.android.lastpkg", 1);
        permissions.removePkg("com.android.lastpkg", 1);
@@ -102,8 +113,9 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {
    }
    }


    @Test
    @Test
    public void testInvalid() throws Exception {
    public void testInvalid() {
        File sliceDir = new File(mContext.getCacheDir(), "slices-test");
        File sliceDir = new File(mContext.getCacheDir(), "testInvalidSlices");
        Log.v(TAG, "testInvalid: slice permissions stored in " + sliceDir.getAbsolutePath());
        if (!sliceDir.exists()) {
        if (!sliceDir.exists()) {
            sliceDir.mkdir();
            sliceDir.mkdir();
        }
        }
@@ -118,7 +130,8 @@ public class SlicePermissionManagerTest extends UiServiceTestCase {


            @Override
            @Override
            public void writeTo(XmlSerializer out) throws IOException {
            public void writeTo(XmlSerializer out) throws IOException {
                throw new RuntimeException("this doesn't work");
                throw new RuntimeException("this RuntimeException inside junk.writeTo() "
                        + "should be caught and suppressed by surrounding code");
            }
            }
        };
        };