2012-04-23 10 views
12

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

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) 

システムにおける既知のシンボリックリンクが/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()を呼び出すことは決してありません。

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

+1

バグレポートを提出したい場合があります。 Ubuntu 11.04システムのopenjdkまたはsun jdkの初期getCanonicalPath()問題を再現できません。 – sarnold

+0

sarnold、正確なOpenJDKのバージョンを使用していますか?おそらくそれが特定のリリースで問題になっているのだろうかと思います。さらに、-Dsun.io.useCanonCaches = falseまたは-Dsun.io.useCanonPrefixCache = falseを設定した場合、標準パスを取得して100%の時間を解決できることが判明しましたが、それは奇妙に見えます。 – Ray

+0

申し訳ありませんが、バージョン番号を含めるとは思いませんでした。 'java -version'は' OpenJDKランタイム環境(IcedTea6 1.10.6)(6b22-1.10.6-0ubuntu1) '' OpenJDK 64ビットサーバVM(ビルド20.0-b11、混合モード) 'を報告します。 – sarnold

答えて

4

私の同僚がOpenJDK 6u23の問題を確認しましたが、それ以前のバージョンでは確認されていません。問題は

A)システムプロパティの形で周りの仕事

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

B)以降のビルド(U24で解決するように見える)

が表示されますがありますので、それは、言われています深く掘り起こす動機はほとんどありません。

0

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

シンボリックリンクの読み取り権を持っているということは、リンクされているファイルのためのアクセス権を持っているという意味ではありません。

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

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

"真"になると、シンボリックリンクを読むことができます。 - を/ usr/share : - /usr/share/java/gnome-java-bridge.jar

と二つのディレクトリへ :あなたの代わりに

、私は、このファイルのアクセス許可をチェックします -/usr/share/java

+0

ファイルとシンボリックリンクの両方に「その他」の「読み込み」があるため、階層内のディレクトリと同じように、これは問題ではないようです。 – Ray

関連する問題