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

Commit 2edcf7a4 authored by Varun Shah's avatar Varun Shah
Browse files

Ensure file modes passed to PFD are valid.

The documentation already states the supported file modes. Start
enforcing that the modes passed to PFD are one of the ones mentioned
in the documentation.

Bug: 414387646
Test: atest FileUtilsTest
Test: atest CtsContentProviderTestCases
Test: atest CtsContentResolverTestCases
Flag: android.os.enforce_strict_file_mode_check
Change-Id: If8e5d2adf4c09a5ed4a75eae9850b7cd79861199
parent f8099b06
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1538,6 +1538,22 @@ public final class FileUtils {

    /** @hide */
    public static int translateModeStringToPosix(String mode) {
        if (Flags.enforceStrictFileModeCheck()) {
            // Note: since the list of supported modes have been documented already in
            // ParcelFileDescriptor#parseMode(), this change is not protected by a compat change.
            // Also, we're explicitly checking the permutations of the supported modes here to avoid
            // throwing an exception for malformed mode strings (see b/414387646 for context).
            return switch (mode) {
                case "r" -> O_RDONLY;
                case "w" -> O_WRONLY | O_CREAT;
                case "wt", "tw" -> O_WRONLY | O_CREAT | O_TRUNC;
                case "wa", "aw" -> O_WRONLY | O_CREAT | O_APPEND;
                case "rw", "wr" -> O_RDWR | O_CREAT;
                case "rwt", "rtw", "wrt", "wtr", "trw", "twr" -> O_RDWR | O_CREAT | O_TRUNC;
                default -> throw new IllegalArgumentException("Bad mode: " + mode);
            };
        }

        // Quick check for invalid chars
        for (int i = 0; i < mode.length(); i++) {
            switch (mode.charAt(i)) {
+10 −0
Original line number Diff line number Diff line
@@ -252,6 +252,16 @@ flag {
    bug: "440630034"
}

flag {
    name: "enforce_strict_file_mode_check"
    namespace: "backstage_power"
    description: "Throw an IllegalArgumentException if the file mode passed to ParcelFileDescriptor#parseMode is unknown."
    bug: "414387646"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "get_private_space_settings"
    namespace: "profile_experiences"
+27 −1
Original line number Diff line number Diff line
@@ -55,6 +55,10 @@ import static org.junit.Assert.fail;

import android.os.FileUtils.MemoryPipe;
import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.ravenwood.RavenwoodRule;
import android.provider.DocumentsContract.Document;
import android.system.Os;
@@ -88,6 +92,9 @@ public class FileUtilsTest {
    @Rule
    public final RavenwoodRule mRavenwood = new RavenwoodRule();

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    private static final String TEST_DATA =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

@@ -675,7 +682,8 @@ public class FileUtilsTest {
    }

    @Test
    public void testTranslateMode() {
    @RequiresFlagsDisabled(Flags.FLAG_ENFORCE_STRICT_FILE_MODE_CHECK)
    public void testTranslateMode_noStrictModeCheck() {
        assertTranslate("r", O_RDONLY, MODE_READ_ONLY);

        assertTranslate("rw", O_RDWR | O_CREAT,
@@ -693,6 +701,24 @@ public class FileUtilsTest {
                MODE_WRITE_ONLY | MODE_CREATE | MODE_APPEND);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_ENFORCE_STRICT_FILE_MODE_CHECK)
    public void testTranslateMode() {
        assertTranslate("r", O_RDONLY, MODE_READ_ONLY);

        assertTranslate("rw", O_RDWR | O_CREAT,
                MODE_READ_WRITE | MODE_CREATE);
        assertTranslate("rwt", O_RDWR | O_CREAT | O_TRUNC,
                MODE_READ_WRITE | MODE_CREATE | MODE_TRUNCATE);

        assertTranslate("w", O_WRONLY | O_CREAT,
                MODE_WRITE_ONLY | MODE_CREATE | MODE_CREATE);
        assertTranslate("wt", O_WRONLY | O_CREAT | O_TRUNC,
                MODE_WRITE_ONLY | MODE_CREATE | MODE_TRUNCATE);
        assertTranslate("wa", O_WRONLY | O_CREAT | O_APPEND,
                MODE_WRITE_ONLY | MODE_CREATE | MODE_APPEND);
    }

    @Test
    public void testMalformedTransate_int() {
        try {