Merge cherrypicks of [2908873, 2908950, 2908867, 2908868, 2908791, 2908793, 2908989, 2908796, 2908798, 2908800, 2908802, 2908804, 2908806, 2908808, 2908632, 2908634, 2908914, 2909049, 2909051, 2908973, 2908874] into nyc-bugfix-release
Change-Id: I9f36c5c6d71b86909179468fe6dcd6c214ff8e70
diff --git a/libart/src/main/java/java/lang/AndroidHardcodedSystemProperties.java b/libart/src/main/java/java/lang/AndroidHardcodedSystemProperties.java
index 13e9317..7e79e28 100644
--- a/libart/src/main/java/java/lang/AndroidHardcodedSystemProperties.java
+++ b/libart/src/main/java/java/lang/AndroidHardcodedSystemProperties.java
@@ -87,7 +87,7 @@
// Hardcode MessagePattern apostrophe mode to be default. b/27265238
{ "android.icu.text.MessagePattern.ApostropheMode", null },
- // Hardcode "sun.io.useCanonCaches" to use the default (on). b/28174137
+ // Hardcode "sun.io.useCanonCaches" to use the default (off). b/28174137, b/62301183
{ "sun.io.useCanonCaches", null },
{ "sun.io.useCanonPrefixCache", null },
@@ -108,4 +108,3 @@
{ "com.sun.security.preserveOldDCEncoding", null },
};
}
-
diff --git a/luni/src/test/java/libcore/java/io/FileTest.java b/luni/src/test/java/libcore/java/io/FileTest.java
index 5d5317a..04de751 100644
--- a/luni/src/test/java/libcore/java/io/FileTest.java
+++ b/luni/src/test/java/libcore/java/io/FileTest.java
@@ -368,4 +368,25 @@
assertEquals("/foo/bar", new File("/foo/", "/bar/").getPath());
assertEquals("/foo/bar", new File("/foo", "/bar//").getPath());
}
+
+ // http://b/62301183
+ public void test_canonicalCachesAreOff() throws Exception {
+ File tempDir = createTemporaryDirectory();
+ File f1 = new File(tempDir, "testCannonCachesOff1");
+ f1.createNewFile();
+ File f2 = new File(tempDir, "testCannonCachesOff2");
+ f2.createNewFile();
+ File symlinkFile = new File(tempDir, "symlink");
+
+ // Create a symlink from symlink to f1 and populate canonical path cache
+ assertEquals(0, Runtime.getRuntime().exec("ln -s " + f1.getAbsolutePath() + " " + symlinkFile.getAbsolutePath()).waitFor());
+ assertEquals(symlinkFile.getCanonicalPath(), f1.getCanonicalPath());
+
+ // Remove it and replace it with a symlink to f2 (using java File/Files would flush caches).
+ assertEquals(0, Runtime.getRuntime().exec("rm " + symlinkFile.getAbsolutePath()).waitFor());
+ assertEquals(0, Runtime.getRuntime().exec("ln -s " + f2.getAbsolutePath() + " " + symlinkFile.getAbsolutePath()).waitFor());
+
+ // Did we cache canonical path results? hope not!
+ assertEquals(symlinkFile.getCanonicalPath(), f2.getCanonicalPath());
+ }
}
diff --git a/ojluni/src/main/java/java/io/FileSystem.java b/ojluni/src/main/java/java/io/FileSystem.java
index aa00fa9..7db1651 100755
--- a/ojluni/src/main/java/java/io/FileSystem.java
+++ b/ojluni/src/main/java/java/io/FileSystem.java
@@ -232,8 +232,11 @@
// Flags for enabling/disabling performance optimizations for file
// name canonicalization
- static boolean useCanonCaches = true;
- static boolean useCanonPrefixCache = true;
+ // Android-changed: Disabled caches for security reasons (b/62301183)
+ //static boolean useCanonCaches = true;
+ //static boolean useCanonPrefixCache = true;
+ static boolean useCanonCaches = false;
+ static boolean useCanonPrefixCache = false;
private static boolean getBooleanProperty(String prop, boolean defaultVal) {
String val = System.getProperty(prop);