java периодически не разрешает символические ссылки в Linux

Я пытаюсь разрешить канонические пути для всех файлов в дереве папок, но по какой-то причине он не будет разрешать их (и периодически код безопасности 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)

известной символической ссылкой в системе является /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, но никогда моими собственными вызовами файла.getCanonicalPath (), как показано выше.

имеет ли это смысл для кого?

2 ответов


мой коллега подтвердил проблему на OpenJDK 6u23, но не на каких-либо предыдущих или следующих версиях. Тем не менее, поскольку вопрос имеет

A) работа вокруг в виде системного свойства

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

B), похоже, разрешен в более поздней сборке (u24)

Кажется, что мало мотивации копать глубже.


в Unix символическая ссылка - это "специальный" файл с собственными разрешениями.

тот факт, что у вас есть разрешение на чтение символической ссылки, не означает, что вы будете иметь его для связанного файла.

Я предполагаю, что вы используете свою программу как пользователь, который может читать символическую ссылку, но не фактический файл.

при входе в режим отладки вы запускаете вызов некоторого метода, который изменяет внутреннее состояние объекта FilePermission, делая его разрешающим фактический файл и, таким образом, возвращает вам "false".

когда вы получаете "true", это просто говорит вам, что вы можете прочитать символическую ссылку.

на вашем месте, я проверю разрешение на этот файл: - /usr / share / java / gnome-java-bridge.Джар

и к двум каталогам: - /usr/доли - /usr / share / java