RFR: JDK-8241883: (zipfs) SeekableByteChannel:close followed by SeekableByteChannel:close will throw an NPE

Alan Bateman Alan.Bateman at oracle.com
Wed Apr 8 20:26:12 UTC 2020



On 08/04/2020 20:36, Lance Andersen wrote:
> :
>
> ——————————
> $ hg diff
> *diff -r f4c174bf0276 
> src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java*
> *--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java   
>   Tue Apr 07 09:03:05 2020 -0400*
> *+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java   
>   Wed Apr 08 11:07:30 2020 -0400*
> @@ -876,6 +876,7 @@
>      // channel is closed
>      private class EntryOutputChannel extends ByteArrayChannel {
>          final Entry e;
> +     final ReadWriteLock rwlock = new ReentrantReadWriteLock();
>
>          EntryOutputChannel(Entry e) {
>              super(e.size > 0? (int)e.size : 8192, false);
> @@ -892,11 +893,24 @@
>
>          @Override
>          public void close() throws IOException {
> -         // will update the entry
> -         try (OutputStream os = getOutputStream(e)) {
> -             os.write(toByteArray());
> +         beginWrite();
> +         try {
> +             if(!isOpen())
> +                 return;
> +             // will update the entry
> +             try (OutputStream os = getOutputStream(e)) {
> +                 os.write(toByteArray());
> +             }
> +             super.close();
> +         } finally {
> +             endWrite();
>              }
> -         super.close();
> +     }
> +     private final void beginWrite() {
> +         rwlock.writeLock().lock();
> +     }
> +     private final void endWrite() {
> +         rwlock.writeLock().unlock();
>          }
>
That is the equivalent of close synchronizing on any object. Are there 
any code paths use the readLock?

-Alan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/nio-dev/attachments/20200408/26ae6fd0/attachment.htm>


More information about the nio-dev mailing list