2012-04-23 21 views
12

Estoy tratando de resolver rutas canónicas para todos los archivos en un árbol de carpetas, pero por alguna razón no los resolverá (y de forma intermitente el código de seguridad JVM resolverá el enlace simbólico de manera adecuada dentro la FilePermission y causa un error de seguridad).java no resolverá enlaces simbólicos intermitentemente en 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) 

Un enlace simbólico conocido en el sistema es /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 

El siguiente código debe resolver este enlace simbólico conocida :

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

pero produce:

/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 

un ensayo adicional, usando el siguiente código, a veces volverá cierto para la comprobación de permisos, pero a veces se devuelve falso:

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

El resultado típico es:

(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 

pero cuando depuración, si paso por la creación de FilePermission en el archivo de destino, internamente la ruta se resuelve en el enlace simbólico, y la salida da como resultado:

(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 

El problema es que, en el contexto de la aplicación en la que se realiza la verificación de permisos, el enlace simbólico siempre se resuelve mediante el objeto FilePermission, pero nunca mediante mis propias llamadas a file.getCanonicalPath() como se demostró anteriormente.

¿Tiene sentido para alguien?

+1

Es posible que desee presentar un informe de error; No puedo reproducir el problema inicial de 'getCanonicalPath()' con openjdk o sun jdk en mi sistema Ubuntu 11.04. – sarnold

+0

sarnold, ¿está utilizando la versión exacta de OpenJDK? Me pregunto si tal vez es un problema en el lanzamiento específico. Además, descubrí que puedo obtener las rutas canónicas para resolver el 100% del tiempo si configuro -Dsun.io.useCanonCaches = false o -Dsun.io.useCanonPrefixCache = false, pero eso parece extraño. – Ray

+0

Lo siento, no pensé incluir números de versión; 'java -version' informa' OpenJDK Runtime Environment (IcedTea6 1.10.6) (6b22-1.10.6-0ubuntu1) '' OpenJDK 64-Bit Server VM (compilación 20.0-b11, modo mixto) '. – sarnold

Respuesta

4

Un colega mío confirmó el problema en OpenJDK 6u23, pero no en ninguna versión anterior ni posterior.Dicho esto, ya que la cuestión tiene

A) un trabajo en torno a la forma de la propiedad del sistema

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

B) parece estar resuelto en la compilación posterior (U24)

parece ser poca motivación para cavar más profundo.

0

En Unix un enlace simbólico es un archivo "especial", con sus propios permisos.

El hecho de que tenga permiso de lectura en el enlace simbólico no implica que lo tenga para el archivo vinculado.

Supongo que está ejecutando su programa como un usuario que puede leer el enlace simbólico pero no el archivo real.

Al ingresar al modo de depuración, desencadena la llamada a algún método que cambie el estado interno del objeto FilePermission haciendo que resuelva el archivo real y devolviéndolo "falso".

Cuando te vuelves "cierto", solo te dice que puedes leer el enlace simbólico.

En su lugar, voy a comprobar los permisos de este fichero: - /usr/share/java/gnome-java-bridge.jar

y para los dos directorios: -/usr/share -/usr/share/java

+0

Tanto el archivo como el enlace simbólico han "leído" para "otro", por lo que este no parece ser el problema, al igual que los directorios en la jerarquía. – Ray

Cuestiones relacionadas