Merge branch '2.4.x' into 2.5.x

Closes gh-27900
This commit is contained in:
Andy Wilkinson
2021-09-09 10:13:40 +01:00
8 changed files with 181 additions and 41 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -97,7 +97,7 @@ class CentralDirectoryParserTests {
}
@Override
public void visitFileHeader(CentralDirectoryFileHeader fileHeader, int dataOffset) {
public void visitFileHeader(CentralDirectoryFileHeader fileHeader, long dataOffset) {
this.headers.add(fileHeader.clone());
}
@@ -121,7 +121,7 @@ class CentralDirectoryParserTests {
}
@Override
public void visitFileHeader(CentralDirectoryFileHeader fileHeader, int dataOffset) {
public void visitFileHeader(CentralDirectoryFileHeader fileHeader, long dataOffset) {
this.invocations.add("visitFileHeader");
}

View File

@@ -36,6 +36,7 @@ import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
@@ -47,6 +48,7 @@ import java.util.zip.ZipFile;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -563,7 +565,7 @@ class JarFileTests {
}
@Test
void zip64JarCanBeRead() throws Exception {
void zip64JarThatExceedsZipEntryLimitCanBeRead() throws Exception {
File zip64Jar = new File(this.tempDir, "zip64.jar");
FileCopyUtils.copy(zip64Jar(), zip64Jar);
try (JarFile zip64JarFile = new JarFile(zip64Jar)) {
@@ -577,6 +579,39 @@ class JarFileTests {
}
}
@Test
void zip64JarThatExceedsZipSizeLimitCanBeRead() throws Exception {
Assumptions.assumeTrue(this.tempDir.getFreeSpace() > 6 * 1024 * 1024 * 1024, "Insufficient disk space");
File zip64Jar = new File(this.tempDir, "zip64.jar");
File entry = new File(this.tempDir, "entry.dat");
CRC32 crc32 = new CRC32();
try (FileOutputStream entryOut = new FileOutputStream(entry)) {
byte[] data = new byte[1024 * 1024];
new Random().nextBytes(data);
for (int i = 0; i < 1024; i++) {
entryOut.write(data);
crc32.update(data);
}
}
try (JarOutputStream jarOutput = new JarOutputStream(new FileOutputStream(zip64Jar))) {
for (int i = 0; i < 6; i++) {
JarEntry storedEntry = new JarEntry("huge-" + i);
storedEntry.setSize(entry.length());
storedEntry.setCompressedSize(entry.length());
storedEntry.setCrc(crc32.getValue());
storedEntry.setMethod(ZipEntry.STORED);
jarOutput.putNextEntry(storedEntry);
try (FileInputStream entryIn = new FileInputStream(entry)) {
StreamUtils.copy(entryIn, jarOutput);
}
jarOutput.closeEntry();
}
}
try (JarFile zip64JarFile = new JarFile(zip64Jar)) {
assertThat(Collections.list(zip64JarFile.entries())).hasSize(6);
}
}
@Test
void nestedZip64JarCanBeRead() throws Exception {
File outer = new File(this.tempDir, "outer.jar");