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


The following commit(s) were added to refs/heads/master by this push:
     new 6bed6b7f5 ZipArchiveOutputStream.addRawArchiveEntry() should check 
is2PhaseSource (#571)
6bed6b7f5 is described below

commit 6bed6b7f536aac29baca663ca83d20557b49b0b8
Author: LoveSy <sh...@zju.edu.cn>
AuthorDate: Thu Sep 12 07:15:57 2024 +0800

    ZipArchiveOutputStream.addRawArchiveEntry() should check is2PhaseSource 
(#571)
    
    * Don't check requested features for is2PhaseSource
    
    This allow user to add manually compressed raw data to the zip file
    under unsupported compression method (e.g., XZ) or encrypt method
    
    * Add test for addRawArchiveEntry with unsupported compression method
---
 .../compress/archivers/zip/ZipArchiveOutputStream.java      |  8 +++++---
 .../java/org/apache/commons/compress/archivers/ZipTest.java | 13 +++++++++++++
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
index 0ee3ab731..3bf24aca8 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
@@ -505,7 +505,7 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
         final boolean is2PhaseSource = ae.getCrc() != 
ZipArchiveEntry.CRC_UNKNOWN && ae.getSize() != ArchiveEntry.SIZE_UNKNOWN
                 && ae.getCompressedSize() != ArchiveEntry.SIZE_UNKNOWN;
         putArchiveEntry(ae, is2PhaseSource);
-        copyFromZipInputStream(rawStream);
+        copyFromZipInputStream(rawStream, is2PhaseSource);
         closeCopiedEntry(is2PhaseSource);
     }
 
@@ -622,11 +622,13 @@ public class ZipArchiveOutputStream extends 
ArchiveOutputStream<ZipArchiveEntry>
         entry = null;
     }
 
-    private void copyFromZipInputStream(final InputStream src) throws 
IOException {
+    private void copyFromZipInputStream(final InputStream src, boolean phased) 
throws IOException {
         if (entry == null) {
             throw new IllegalStateException("No current entry");
         }
-        ZipUtil.checkRequestedFeatures(entry.entry);
+        if (!phased) {
+            ZipUtil.checkRequestedFeatures(entry.entry);
+        }
         entry.hasWritten = true;
         int length;
         while ((length = src.read(copyBuffer)) >= 0) {
diff --git a/src/test/java/org/apache/commons/compress/archivers/ZipTest.java 
b/src/test/java/org/apache/commons/compress/archivers/ZipTest.java
index 42c9fb11d..f8c66a289 100644
--- a/src/test/java/org/apache/commons/compress/archivers/ZipTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/ZipTest.java
@@ -738,6 +738,19 @@ public final class ZipTest extends AbstractTest {
         }
     }
 
+    @Test
+    public void testUnsupportedCompressionMethodInAddRaw() throws IOException {
+        final File file1 = createTempFile("unsupportedCompressionMethod.", 
".zip");
+        try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream(file1)) {
+            final ZipArchiveEntry archiveEntry = new ZipArchiveEntry("fred");
+            archiveEntry.setMethod(Integer.MAX_VALUE);
+            archiveEntry.setSize(3);
+            archiveEntry.setCompressedSize(3);
+            archiveEntry.setCrc(0);
+            zos.addRawArchiveEntry(archiveEntry, new 
ByteArrayInputStream("fud".getBytes()));
+        }
+    }
+
     /**
      * Archives 2 files and unarchives it again. If the file length of result 
and source is the same, it looks like the operations have worked
      *

Reply via email to