Loading core/java/android/os/FileUtils.java +16 −0 Original line number Diff line number Diff line Loading @@ -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)) { Loading core/java/android/os/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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" Loading core/tests/coretests/src/android/os/FileUtilsTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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, Loading @@ -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 { Loading Loading
core/java/android/os/FileUtils.java +16 −0 Original line number Diff line number Diff line Loading @@ -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)) { Loading
core/java/android/os/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
core/tests/coretests/src/android/os/FileUtilsTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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, Loading @@ -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 { Loading