On Fri, 8 Dec 2023 10:18:18 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> Justin Lu has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   drop additional specification
>
> src/java.base/share/classes/java/util/zip/ZipFile.java line 494:
> 
>> 492:     @Override
>> 493:     public String toString() {
>> 494:         return res.zsrc.key.file.getName()
> 
> Hello Justin, relying on `res.zsrc.key.file` to get to the file name can 
> cause troubles. For example, consider this usage (which I ran in jshell) with 
> this proposed change in this PR:
> 
> 
> jshell> import java.util.zip.*
> 
> jshell> ZipFile zf = new ZipFile("/tmp/workdir.zip")
> zf ==> workdir.zip@34c45dca
> 
> jshell> zf.close()
> 
> jshell> zf.toString()
> |  Exception java.lang.NullPointerException: Cannot read field "key" because 
> "this.res.zsrc" is null
> |        at ZipFile.toString (ZipFile.java:494)
> |        at (#4:1)
> 
> 
> 
> What I do here is that I call `ZipFile.toString()` after I (intentionally) 
> close the `ZipFile`. The `toString()` call leads to `NullPointerException` 
> because on closing the `ZipFile` instance we clean up the resource it holds 
> on to.
> 
> I think what we can do here is, something like (the following diff was 
> generated on top of the current state of this PR):
> 
> 
> diff --git a/src/java.base/share/classes/java/util/zip/ZipFile.java 
> b/src/java.base/share/classes/java/util/zip/ZipFile.java
> index 67a5e65089f..2b6996294e1 100644
> --- a/src/java.base/share/classes/java/util/zip/ZipFile.java
> +++ b/src/java.base/share/classes/java/util/zip/ZipFile.java
> @@ -95,7 +95,8 @@
>   */
>  public class ZipFile implements ZipConstants, Closeable {
>  
> -    private final String name;     // zip file name
> +    private final String filePath;     // zip file path
> +    private final String fileName;     // name of the file
>      private volatile boolean closeRequested;
>  
>      // The "resource" used by this zip file that needs to be
> @@ -245,7 +246,8 @@ public ZipFile(File file, int mode, Charset charset) 
> throws IOException
>          }
>          Objects.requireNonNull(charset, "charset");
>  
> -        this.name = name;
> +        this.filePath = name;
> +        this.fileName = file.getName();
>          long t0 = System.nanoTime();
>  
>          this.res = new CleanableResource(this, ZipCoder.get(charset), file, 
> mode);
> @@ -483,7 +485,7 @@ public int available() throws IOException {
>       * @return the path name of the ZIP file
>       */
>      public String getName() {
> -        return name;
> +        return filePath;
>      }
>  
>      /**
> @@ -491,7 +493,7 @@ public String getName() {
>       */
>      @Override
>      public String toString() {
> -        return res.zsrc.key.file.getName()
> +        return this.fileName
>                  + "@" + Intege...

Hi Jai,

Thank you for the detailed response and suggested alternative.

My intentions were to get the file name by leveraging the existing code without 
introducing an additional field if possible, but I did not realize the `NPE` it 
would cause when closing the ZipFile as you demonstrated.

I appreciate your guidance, updated the PR to reflect your suggestions. I don't 
see how this would cause any issues with tests as you stated, but checked tiers 
1-3 and all is good there.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16643#discussion_r1421964393

Reply via email to