This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit aab830d131e9df3f1ca2e4701d25d7ededb5f62a Author: Gary Gregory <[email protected]> AuthorDate: Fri May 17 10:44:28 2024 -0400 Avoid NullPointerException in java.nio.channels.spi.AbstractInterruptibleChannel.close() when calling org.apache.commons.compress.archivers.zip.FileRandomAccessOutputStream.close() --- src/changes/changes.xml | 1 + .../archivers/zip/FileRandomAccessOutputStream.java | 4 +++- .../archivers/zip/FileRandomAccessOutputStreamTest.java | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8c3c6fc0f..bcf059fa2 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -57,6 +57,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="Gary Gregory">ArArchiveOutputStream implicit narrowing conversion in compound assignment.</action> <action type="fix" issue="COMPRESS-679" dev="ggregory" due-to="Mikaƫl MECHOULAM, Gary Gregory">Regression on parallel processing of 7zip files.</action> <action type="fix" issue="COMPRESS-675" dev="ggregory" due-to="Tim Allison, Gary Gregory">Regression in pack200's Archive class -- underlying InputStream is now closed.</action> + <action type="fix" dev="ggregory" due-to="Gary Gregory">Avoid NullPointerException in java.nio.channels.spi.AbstractInterruptibleChannel.close() when calling org.apache.commons.compress.archivers.zip.FileRandomAccessOutputStream.close().</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump org.apache.commons:commons-parent from 66 to 69 #495, #508.</action> <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump org.ow2.asm:asm from 9.6 to 9.7 #504.</action> diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStream.java index 7083998c4..319d2f6fa 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStream.java @@ -52,7 +52,9 @@ class FileRandomAccessOutputStream extends RandomAccessOutputStream { @Override public void close() throws IOException { - channel.close(); + if (channel.isOpen()) { + channel.close(); + } } @Override diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStreamTest.java index 7cccd2514..1c563c250 100644 --- a/src/test/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/zip/FileRandomAccessOutputStreamTest.java @@ -48,10 +48,20 @@ public class FileRandomAccessOutputStreamTest extends AbstractTempDirTest { } } + @Test + public void testClose() throws IOException { + final Path file = newTempPath("testChannel"); + try (FileRandomAccessOutputStream stream = new FileRandomAccessOutputStream(file)) { + assertNotNull(stream.channel()); + stream.close(); + stream.close(); + } + } + @Test public void testWrite() throws IOException { - final FileChannel channel = mock(FileChannel.class); - final FileRandomAccessOutputStream stream = new FileRandomAccessOutputStream(channel); + FileChannel channel = mock(FileChannel.class); + FileRandomAccessOutputStream stream = new FileRandomAccessOutputStream(channel); when(channel.write((ByteBuffer) any())).thenAnswer(answer -> { ((ByteBuffer) answer.getArgument(0)).position(5); return 5; @@ -62,7 +72,6 @@ public class FileRandomAccessOutputStreamTest extends AbstractTempDirTest { stream.write("hello".getBytes(StandardCharsets.UTF_8)); stream.write("world\n".getBytes(StandardCharsets.UTF_8)); verify(channel, times(2)).write((ByteBuffer) any()); - assertEquals(11, stream.position()); }
