On Mon, 19 May 2025 12:22:11 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> ""would this change now have a chance of introducing a 
>> ReadOnlyFileSystemException when constructing the ZipFileSystem whereas 
>> before it wouldn't?""
>> 
>> If there was ever a "ReadOnlyFileSystemException" when initializing the 
>> ZipFileSystem, we have a very serious bug already. Since we already have the 
>> opening of Zip working for cases where the underlying file is read-only in 
>> the file system, it has to be true that no attempt is made to modify the 
>> file contents.
>> 
>> While I accept that this new code now calls out to functions with this flag 
>> in a different state to before, I believe this is an absolute improvement 
>> since:
>> 
>> 1. It is not acceptable to say to users "we support a read-only mode" if 
>> during initialization we might modify the file in any way (even including 
>> changing last-modification times etc.).
>> 
>> 2. All the evidence points to whichever operations are being done during 
>> init as being fundamentally "read-only" (both due to it working on read-only 
>> zip files, and there being no conceptual need to modify anything during 
>> setup).
>> 
>> I'll happily do a thorough audit of everything which could be affected by 
>> this change if that will give you confidence, but I would not want to change 
>> this code back to its default "read-write until stated otherwise" behaviour.
>
> Hello David, I had another look at this code and after going through it, it 
> looked like `readOnly` field can in fact be made `final` because of the 
> refactoring changes that you did in this PR. I checked out your latest PR 
> locally and here's the additional change I did:
> 
> 
> diff --git a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java 
> b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
> index e2fddd96fe8..f54b5360ac5 100644
> --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
> +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
> @@ -110,8 +110,7 @@ class ZipFileSystem extends FileSystem {
>      private final Path zfpath;
>      final ZipCoder zc;
>      private final ZipPath rootdir;
> -    // Starts in readOnly (safe mode), but might be reset at the end of 
> initialization.
> -    private boolean readOnly = true;
> +    private final boolean readOnly;
>  
>      // default time stamp for pseudo entries
>      private final long zfsDefaultTimeStamp = System.currentTimeMillis();
> @@ -227,11 +226,6 @@ static ZipAccessMode from(Object value) {
>  
>          // Determining a release version uses 'this' instance to read paths 
> etc.
>          Optional<Integer> multiReleaseVersion = determineReleaseVersion(env);
> -
> -        // Set the version-based lookup function for multi-release JARs.
> -        this.entryLookup =
> -                
> multiReleaseVersion.map(this::createVersionedLinks).orElse(Function.identity());
> -
>          // We only allow read-write zip/jar files if they are not 
> multi-release
>          // JARs and the underlying file is writable.
>          this.readOnly = forceReadOnly || multiReleaseVersion.isPresent() || 
> !Files.isWritable(zfpath);
> @@ -241,6 +235,10 @@ static ZipAccessMode from(Object value) {
>                      : "the ZIP file is not writable";
>              throw new IOException(reason);
>          }
> +        // Set the version-based lookup function for multi-release JARs.
> +        this.entryLookup =
> +                
> multiReleaseVersion.map(this::createVersionedLinks).orElse(Function.identity());
> +
>      }
>  
>      /**
> 
> 
> 
> 
> With the refactoring changes you have done so far, we are now able to 
> determine the ultimate value for `readOnly` before anything in the 
> construction of `ZipFileSystem` would need access to it. Does this additional 
> change look reasonable to you? I haven't run any tests against this change.
> 
> Making it `final` and having it not accessed until the ultimate value is set 
> in the constructor would get us past any of t...

On second thought, may be this isn't enough. I see that I missed the fact that 
`determineReleaseVersion()` requires access to `this`. Please leave this in the 
current form that you have in your PR. I need a few more moments to consider if 
anything needs to be changed.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/25178#discussion_r2095591964

Reply via email to