12

フォルダー ツリー内のすべてのファイルの正規パスを解決しようとしていますが、何らかの理由で解決されません (断続的に、JVM セキュリティ コードが FilePermission 内のシンボリック リンクを適切に解決し、セキュリティ エラーが発生します)。

環境:

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

システム内の既知のシンボリック リンクは /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

次のコードは、この既知のシンボリック リンクを解決する必要があります。

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 の作成をステップ実行すると、内部的にパスがシンボリック リンクに解決され、出力は次のようになります。

(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

問題は、パーミッション チェックが実際に行われるアプリのコンテキスト内で、シンボリック リンクは常に FilePermission オブジェクトによって解決されますが、上記のように自分で file.getCanonicalPath() を呼び出すことによって解決されることはありません。

これは誰にとっても意味がありますか?

4

2 に答える 2

4

私の同僚は、OpenJDK 6u23 でこの問題を確認しましたが、それ以前または以降のバージョンでは確認していません。そうは言っても、問題が発生したため、

A)システムプロパティの形での回避策

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

B) 後のビルド (u24) で解決されるようです

これ以上深く掘り下げる動機はほとんどないようです。

于 2012-05-18T13:30:23.680 に答える
0

Unix では、シンボリック リンクは独自の権限を持つ「特別な」ファイルです。

シンボリック リンクに対する読み取り権限を持っているという事実は、リンクされたファイルに対してそれを持っていることを意味するものではありません。

ここでの私の推測では、シンボリック リンクを読み取ることはできるが実際のファイルを読み取れないユーザーとしてプログラムを実行していると思われます。

デバッグモードに入ると、 FilePermission オブジェクトの内部状態を変更して実際のファイルに解決し、「false」を返すメソッドの呼び出しをトリガーします。

「true」になると、シンボリックリンクを読み取ることができることを示しています。

あなたの代わりに、このファイルの許可を確認します: - /usr/share/java/gnome-java-bridge.jar

および 2 つのディレクトリへ: - /usr/share - /usr/share/java

于 2012-05-16T07:30:07.343 に答える