java会间歇性地不解析Linux上的符号链接

Ray*_*Ray 12 java linux permissions openjdk

我正在尝试解决文件夹树中所有文件的规范路径,但由于某种原因它无法解决它们(并且间歇性地JVM安全代码将在FilePermission中正确解析符号链接并导致安全性错误).

ENV:

$ java -version
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud)

系统中已知的符号链接是/usr/share/java/gnome-java-bridge.jar:

$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar
Run Code Online (Sandbox Code Playgroud)

以下代码应解析此已知符号链接:

String symlinkedFilePath =
    "/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";

File symlinkedFile = new File(symlinkedFilePath);

System.out.println(symlinkedFile.getAbsolutePath());
System.out.println(symlinkedFile.getCanonicalPath());
Run Code Online (Sandbox Code Playgroud)

但产生:

/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
Run Code Online (Sandbox Code Playgroud)

使用以下代码进行的进一步测试有时会返回true以进行权限检查,但有时会返回false:

String symlinkedFilePath =
    "/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";

File symlinkedFile = new File(symlinkedFilePath);

FilePermission recursivePermission = new FilePermission(
    symlinkedFile.getParentFile().getParent() + "/-", "read");

FilePermission filePermission = new FilePermission(
    symlinkedFile.getAbsolutePath(), "read");

System.out.println(recursivePermission);
System.out.println(filePermission);
System.out.println(
    "Can read symlink: " + recursivePermission.implies(filePermission));
Run Code Online (Sandbox Code Playgroud)

典型的结果是:

(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: true
Run Code Online (Sandbox Code Playgroud)

但是在调试时,如果我在目标文件上逐步创建FilePermission,则在内部将路径解析为符号链接,输出结果为:

(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: false
Run Code Online (Sandbox Code Playgroud)

问题是在实际进行权限检查的应用程序的上下文中,符号链接始终由FilePermission对象解析,但从不通过我自己对file.getCanonicalPath()的调用,如上所示.

这对任何人都有意义吗?

Ray*_*Ray 4

我的一位同事在 OpenJDK 6u23 上确认了该问题,但在任何先前或后续版本上均未确认。话虽这么说,既然这个问题已经

A)以系统属性的形式解决问题

-Dsun.io.useCanonCaches=false 
OR
-Dsun.io.useCanonPrefixCache=false
Run Code Online (Sandbox Code Playgroud)

B) 似乎在以后的版本中得到了解决 (u24)

似乎没有动力进一步挖掘。