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 68f94a4a2947dc214a50b725f1d18cb16c6f8add Author: Gary D. Gregory <garydgreg...@gmail.com> AuthorDate: Sat Mar 1 15:44:21 2025 -0500 Fix internal position state in FileRandomAccessOutputStream only used for testing --- .../zip/FileRandomAccessOutputStream.java | 1 + .../archivers/zip/ZipArchiveOutputStream.java | 22 +++++++++++----------- .../zip/FileRandomAccessOutputStreamTest.java | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) 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 2748fd241..ee3e39f94 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 @@ -80,5 +80,6 @@ public void writeAll(final byte[] b, final int off, final int len, final long po } currentPos += written; } + position += len; } } 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 d0ccb78f6..7f9759350 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 @@ -1243,20 +1243,20 @@ private void putArchiveEntry(final ZipArchiveEntry archiveEntry, final boolean p * sizes. */ private void rewriteSizesAndCrc(final boolean actuallyNeedsZip64) throws IOException { - final RandomAccessOutputStream randomStream = (RandomAccessOutputStream) out; + final RandomAccessOutputStream outputStream = (RandomAccessOutputStream) out; long dataStart = entry.localDataStart; - if (randomStream instanceof ZipSplitOutputStream) { - dataStart = ((ZipSplitOutputStream) randomStream).calculateDiskPosition(entry.entry.getDiskNumberStart(), dataStart); + if (outputStream instanceof ZipSplitOutputStream) { + dataStart = ((ZipSplitOutputStream) outputStream).calculateDiskPosition(entry.entry.getDiskNumberStart(), dataStart); } long position = dataStart; - randomStream.writeAll(ZipLong.getBytes(entry.entry.getCrc()), position); position += ZipConstants.WORD; + outputStream.writeAll(ZipLong.getBytes(entry.entry.getCrc()), position); position += ZipConstants.WORD; if (!hasZip64Extra(entry.entry) || !actuallyNeedsZip64) { - randomStream.writeAll(ZipLong.getBytes(entry.entry.getCompressedSize()), position); position += ZipConstants.WORD; - randomStream.writeAll(ZipLong.getBytes(entry.entry.getSize()), position); + outputStream.writeAll(ZipLong.getBytes(entry.entry.getCompressedSize()), position); position += ZipConstants.WORD; + outputStream.writeAll(ZipLong.getBytes(entry.entry.getSize()), position); } else { - randomStream.writeAll(ZipLong.ZIP64_MAGIC.getBytes(), position); position += ZipConstants.WORD; - randomStream.writeAll(ZipLong.ZIP64_MAGIC.getBytes(), position); + outputStream.writeAll(ZipLong.ZIP64_MAGIC.getBytes(), position); position += ZipConstants.WORD; + outputStream.writeAll(ZipLong.ZIP64_MAGIC.getBytes(), position); } position += ZipConstants.WORD; @@ -1267,14 +1267,14 @@ private void rewriteSizesAndCrc(final boolean actuallyNeedsZip64) throws IOExcep position = dataStart + 3 * ZipConstants.WORD + 2 * ZipConstants.SHORT + nameLen + 2 * ZipConstants.SHORT; // inside the ZIP64 extra uncompressed size comes // first, unlike the LFH, CD or data descriptor - randomStream.writeAll(ZipEightByteInteger.getBytes(entry.entry.getSize()), position); position += ZipConstants.DWORD; - randomStream.writeAll(ZipEightByteInteger.getBytes(entry.entry.getCompressedSize()), position); position += ZipConstants.DWORD; + outputStream.writeAll(ZipEightByteInteger.getBytes(entry.entry.getSize()), position); position += ZipConstants.DWORD; + outputStream.writeAll(ZipEightByteInteger.getBytes(entry.entry.getCompressedSize()), position); position += ZipConstants.DWORD; if (!actuallyNeedsZip64) { // do some cleanup: // * rewrite version needed to extract position = dataStart - 5 * ZipConstants.SHORT; - randomStream.writeAll(ZipShort.getBytes(versionNeededToExtract(entry.entry.getMethod(), false, false)), position); + outputStream.writeAll(ZipShort.getBytes(versionNeededToExtract(entry.entry.getMethod(), false, false)), position); position += ZipConstants.SHORT; // * remove ZIP64 extra, so it doesn't get written 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 754f7967b..92cc97d54 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 @@ -95,7 +95,7 @@ public void testWriteFullyAt_whenFullAtOnce_thenSucceed() throws IOException { verify(channel, times(1)).write((ByteBuffer) any(), eq(20L)); verify(channel, times(1)).write((ByteBuffer) any(), eq(30L)); - assertEquals(0, stream.position()); + assertEquals(11, stream.position()); } @Test @@ -121,7 +121,7 @@ public void testWriteFullyAt_whenFullButPartial_thenSucceed() throws IOException verify(channel, times(1)).write((ByteBuffer) any(), eq(23L)); verify(channel, times(1)).write((ByteBuffer) any(), eq(30L)); - assertEquals(0, stream.position()); + assertEquals(11, stream.position()); } @Test