Can I please get a review of this proposed fix for 
https://bugs.openjdk.java.net/browse/JDK-8251329?

As noted in that issue, if a zip filesystem created on top of a jar containing 
a "./" entry is "walked" using the `Files.walkFileTree`, it leads to a infinite 
never ending iteration (which ultimately fails with Java heap space OOM).

Alan notes in that issue that:

> This is more likely an issue with the zipfs DirectoryStream implementation. A 
> DirectoryStream is specified to not include elements that for the special 
> links to the current or parent directory. It should be rare. 

This indeed turned out to be an issue in the 
`jdk.nio.zipfs.ZipDirectoryStream#iterator()` implementation where it calls the 
`jdk.nio.zipfs.ZipFileSystem#iteratorOf(...)` implementation.  The 
implementation, unlike what the javadoc of `java.nio.file.DirectoryStream` 
states, was including the "." and ".." paths in its returned iterator:

> The elements returned by the iterator are in no specific order. Some file
 systems maintain special links to the directory itself and the directory's
  parent directory. Entries representing these links are not returned by the
  iterator.


The proposed fix in this patch checks the paths for "." and "..", similar to 
what the `sun.nio.fs.UnixDirectoryStream` does in its `isSelfOrParent` and 
skips those paths from being added into the returned iterator. The 
`jdk.nio.zipfs.ZipFileSystem#iteratorOf(...)` (where this change has been done) 
is currently only used by `jdk.nio.zipfs.ZipDirectoryStream#iterator()` and has 
package-private visibility, so this change shouldn't impact any other 
usage/expectations.

A new jtreg test has been added to reproduce this issue and verify the fix. 
Local testing of the `test/jdk/jdk/nio/` (including this new test) went fine 
without any issues after this change. I will be triggering a `tier1` test 
locally in a while.

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

Commit messages:
 - 8251329: (zipfs) Files.walkFileTree walks infinitely if zip has dir named 
"." inside

Changes: https://git.openjdk.java.net/jdk/pull/4604/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4604&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8251329
  Stats: 173 lines in 3 files changed: 170 ins; 0 del; 3 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4604.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4604/head:pull/4604

PR: https://git.openjdk.java.net/jdk/pull/4604

Reply via email to