gpt4 book ai didi

Java 会间歇性地不解析 Linux 上的符号链接(symbolic link)

转载 作者:IT王子 更新时间:2023-10-28 23:55:31 29 4
gpt4 key购买 nike

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

环境:

$ 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)

系统中已知的符号链接(symbolic link)是/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

以下代码应该解析这个已知的符号链接(symbolic link):

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());

但产生:

/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

进一步测试,使用以下代码,有时会为权限检查返回 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));

典型的结果是:

(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

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

(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

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

这对任何人都有意义吗?

最佳答案

我的一位同事在 OpenJDK 6u23 上确认了这个问题,但在任何之前或之后的版本上都没有。话虽这么说,因为这个问题已经

A) 以系统属性的形式变通

-Dsun.io.useCanonCaches=false 
OR
-Dsun.io.useCanonPrefixCache=false

B) 似乎在后来的构建 (u24) 中得到解决

似乎没有动力去深入挖掘。

关于Java 会间歇性地不解析 Linux 上的符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273575/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com