RFR: 8352728: InternalError loading java.security due to Windows parent folder permissions [v14]

Weijun Wang weijun at openjdk.org
Wed Dec 10 17:54:04 UTC 2025


On Wed, 10 Dec 2025 15:59:57 GMT, Francisco Ferrari Bihurriet <fferrari at openjdk.org> wrote:

>> The problem with [`Path::normalize`](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/Path.html#normalize()) is the following one:
>>> Eliminating ".." and a preceding name from a path may result in the path that locates a different file than the original path. This can arise when the preceding name is a symbolic link.
>> 
>> This can be demonstrated with the following files structure:
>> 
>> 
>> /tmp/a
>> └── /tmp/a/b -> /tmp/x/y
>> /tmp/x
>> ├── /tmp/x/f2        (name=value)
>> └── /tmp/x/y
>>     └── /tmp/x/y/f1  (include ../f2)
>> 
>> 
>> Which can be created with:
>> 
>> 
>> mkdir -p /tmp/x/y /tmp/a
>> echo 'include ../f2' >/tmp/x/y/f1
>> echo 'name=value' >/tmp/x/f2
>> ln -s /tmp/x/y /tmp/a/b
>> 
>> 
>> Now let's assume we are processing `/tmp/a/b/f1`, `include ../f2` is computed as `included`:
>> 
>> 
>> jshell -<<'EOF'
>> Path current = Path.of("/tmp/a/b/f1");
>> Path included = current.resolveSibling("../f2");
>> System.out.println("                                      included: " +
>>         included);
>> System.out.println("                         included.toRealPath(): " +
>>         included.toRealPath());
>> System.out.println("included.toRealPath(LinkOption.NOFOLLOW_LINKS): " +
>>         included.toRealPath(LinkOption.NOFOLLOW_LINKS));
>> System.out.println("                          included.normalize(): " +
>>         included.normalize());
>> EOF
>> 
>> 
>> Output:
>> 
>> 
>>                                       included: /tmp/a/b/../f2
>>                          included.toRealPath(): /tmp/x/f2
>> included.toRealPath(LinkOption.NOFOLLOW_LINKS): /tmp/a/b/../f2
>>                           included.normalize(): /tmp/a/f2
>> 
>> 
>> But `/tmp/a/f2` doesn't exist:
>> 
>> 
>> user at host:~$ cat /tmp/a/f2
>> cat: /tmp/a/f2: No such file or directory
>> 
>> 
>> To destroy the created directories and files use:
>> 
>> 
>> rm -rf /tmp/x /tmp/a
>
> If you prefer, I can leave the code as it is now, without applying the [suggested change](#discussion_r2594151432).

I'm a little confused. Now that we have agreed to no longer revolving symlinks, `/tmp/a/b/../f2` should indeed be `/tmp/a/f2`. Since it does not exist, we simply fail. Why is this a problem? Did I miss anything?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/24465#discussion_r2607641780


More information about the security-dev mailing list