> Hi, this is a proposal to fix 8352728.
> 
> The main idea is to replace 
> [`java.nio.file.Path::toRealPath`](https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/nio/file/Path.html#toRealPath(java.nio.file.LinkOption...))
>  by 
> [`java.io.File::getCanonicalPath`](https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/File.html#getCanonicalPath())
>  for path canonicalization purposes. The rationale behind this decision is 
> the following:
> 
> 1. In _Windows_, `File::getCanonicalPath` handles restricted permissions in 
> parent directories. Contrarily, `Path::toRealPath` fails with 
> `AccessDeniedException`.
> 2. In _Linux_, `File::getCanonicalPath` handles non-regular files (e.g. 
> `/dev/stdin`). Contrarily, `Path::toRealPath` fails with 
> `NoSuchFileException`.
> 
> #### Windows Case
> 
> @martinuy and I tracked down the `File::getCanonicalPath` vs 
> `Path::toRealPath` behaviour differences in _Windows_. Both methods end up 
> calling the 
> [`FindFirstFileW`](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfilew)
>  API inside a loop for each parent directory in the path, until they include 
> the leaf:
> 
> * 
> [`File::getCanonicalPath`](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/share/classes/java/io/File.java#L618
>  "src/java.base/share/classes/java/io/File.java:618") goes through the 
> following stack into `FindFirstFileW`:
>     * 
> [`WinNTFileSystem::canonicalize`](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/windows/classes/java/io/WinNTFileSystem.java#L473
>  "src/java.base/windows/classes/java/io/WinNTFileSystem.java:473")
>     * 
> [`WinNTFileSystem::canonicalize0`](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/windows/native/libjava/WinNTFileSystem_md.c#L288
>  "src/java.base/windows/native/libjava/WinNTFileSystem_md.c:288")
>     * 
> [`wcanonicalize`](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/windows/native/libjava/canonicalize_md.c#L233
>  "src/java.base/windows/native/libjava/canonicalize_md.c:233") (here is the 
> loop)
>     * If `FindFirstFileW` fails with `ERROR_ACCESS_DENIED`, 
> `lastErrorReportable` is consulted, the error is [considered 
> non-reportable](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/windows/native/libjava/canonicalize_md.c#L139
>  "src/java.base/windows/native/libjava/canonicalize_md.c:139") and the 
> iteration is stopped 
> [here](https://github.com/openjdk/jdk/blob/jdk-24-ga/src/java.base/windows/native/libjava/canonicalize_md.c#L246-L250
>  "src/java.base/windows/native/libjava/c...

Francisco Ferrari Bihurriet has updated the pull request with a new target base 
due to a merge or a rebase. The incremental webrev excludes the unrelated 
changes brought in by the merge/rebase. The pull request contains three 
additional commits since the last revision:

 - Do minor adjustments
   
   Update copyright year, improve comments and use File::toPath to convert
   back to Path.
 - Merge openjdk/master into JDK-8352728
 - 8352728: InternalError loading java.security due to Windows parent folder 
permissions

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/24465/files
  - new: https://git.openjdk.org/jdk/pull/24465/files/308479dd..a8c5ca74

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=24465&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=24465&range=00-01

  Stats: 206256 lines in 690 files changed: 21802 ins; 181929 del; 2525 mod
  Patch: https://git.openjdk.org/jdk/pull/24465.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/24465/head:pull/24465

PR: https://git.openjdk.org/jdk/pull/24465

Reply via email to