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