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());
     }
 

Reply via email to