You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2025/08/16 11:56:10 UTC
(commons-compress) 03/03: org.apache.commons.compress.harmony.unpack200 now throws Pack200Exception, instead of other runtime exceptions
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 d561559e2745f8cd3c22d6bc8020a32720b80a6c
Author: Gary D. Gregory <ga...@gmail.com>
AuthorDate: Sat Aug 16 07:56:00 2025 -0400
org.apache.commons.compress.harmony.unpack200 now throws
Pack200Exception, instead of other runtime exceptions
---
src/changes/changes.xml | 4 ++--
.../unpack200/bytecode/forms/TableSwitchForm.java | 24 ++++++----------------
.../harmony/unpack200/LookupSwitchFormTest.java | 2 +-
...witchFormTest.java => TableSwitchFormTest.java} | 19 +++++++++--------
4 files changed, 19 insertions(+), 30 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f214de914..df32edcc2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -77,9 +77,9 @@ The <action> type attribute can be add,update,fix,remove.
<action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.compress.archivers.ar.ArArchiveInputStream.read(byte[], int, int) now throws ArchiveException instead of ArithmeticException.</action>
<action type="fix" dev="pkarwasz" due-to="Tyler Nighswander">Simplify handling of special AR records in ArArchiveInputStream.</action>
<!-- FIX unpack200 -->
- <action type="fix" dev="ggregory" due-to="Gary Gregory, Stanislav Fort">org.apache.commons.compress.harmony.unpack200 now throws Pack200Exception, IllegalArgumentException, and IllegalStateException instead of Error.</action>
+ <action type="fix" dev="ggregory" due-to="Gary Gregory, Stanislav Fort">org.apache.commons.compress.harmony.unpack200 now throws Pack200Exception, IllegalArgumentException, and IllegalStateException instead of other runtime exceptions and Error.</action>
<!-- FIX pack200 -->
- <action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.compress.harmony.pack200 now throws Pack200Exception, IllegalArgumentException, and IllegalStateException instead of Error.</action>
+ <action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.compress.harmony.pack200 now throws Pack200Exception, IllegalArgumentException, IllegalStateException, instead of Error.</action>
<!-- FIX cpio -->
<action type="fix" dev="ggregory" due-to="Stan, Gary Gregory">org.apache.commons.compress.archivers.cpio.CpioArchiveEntry now throws ArchiveException instead of Arithmetic exception.</action>
<action type="fix" dev="ggregory" due-to="Stan, Gary Gregory">org.apache.commons.compress.archivers.cpio.CpioArchiveInputStream.getNextEntry() now throws a MemoryLimitException instead of OutOfMemoryError when it can't process input greater than available memory.</action>
diff --git a/src/main/java/org/apache/commons/compress/harmony/unpack200/bytecode/forms/TableSwitchForm.java b/src/main/java/org/apache/commons/compress/harmony/unpack200/bytecode/forms/TableSwitchForm.java
index 2bf0453e2..2ed5fc8a9 100644
--- a/src/main/java/org/apache/commons/compress/harmony/unpack200/bytecode/forms/TableSwitchForm.java
+++ b/src/main/java/org/apache/commons/compress/harmony/unpack200/bytecode/forms/TableSwitchForm.java
@@ -20,6 +20,7 @@
import java.util.Arrays;
+import org.apache.commons.compress.harmony.pack200.Pack200Exception;
import org.apache.commons.compress.harmony.unpack200.bytecode.ByteCode;
import org.apache.commons.compress.harmony.unpack200.bytecode.OperandManager;
@@ -47,31 +48,25 @@ public TableSwitchForm(final int opcode, final String name) {
* compress.harmony.unpack200.bytecode.ByteCode, org.apache.commons.compress.harmony.unpack200.bytecode.OperandManager, int)
*/
@Override
- public void setByteCodeOperands(final ByteCode byteCode, final OperandManager operandManager, final int codeLength) {
+ public void setByteCodeOperands(final ByteCode byteCode, final OperandManager operandManager, final int codeLength) throws Pack200Exception {
final int caseCount = operandManager.nextCaseCount();
final int defaultPc = operandManager.nextLabel();
- int caseValue = -1;
- caseValue = operandManager.nextCaseValues();
-
- final int[] casePcs = new int[caseCount];
+ final int caseValue = operandManager.nextCaseValues();
+ final int[] casePcs = new int[Pack200Exception.checkIntArray(caseCount)];
Arrays.setAll(casePcs, i -> operandManager.nextLabel());
-
- final int[] labelsArray = new int[caseCount + 1];
+ final int[] labelsArray = new int[Pack200Exception.checkIntArray(caseCount + 1)];
labelsArray[0] = defaultPc;
System.arraycopy(casePcs, 0, labelsArray, 1, caseCount + 1 - 1);
byteCode.setByteCodeTargets(labelsArray);
-
final int lowValue = caseValue;
final int highValue = lowValue + caseCount - 1;
// All this gets dumped into the rewrite bytes of the
// poor bytecode.
-
// Unlike most byte codes, the TableSwitch is a
// variable-sized bytecode. Because of this, the
// rewrite array has to be defined here individually
// for each bytecode, rather than in the ByteCodeForm
// class.
-
// First, there's the bytecode. Then there are 0-3
// bytes of padding so that the first (default)
// label is on a 4-byte offset.
@@ -80,36 +75,29 @@ public void setByteCodeOperands(final ByteCode byteCode, final OperandManager op
+ 4 // lowbyte
+ 4 // highbyte
+ 4 * casePcs.length;
-
- final int[] newRewrite = new int[rewriteSize];
+ final int[] newRewrite = new int[Pack200Exception.checkIntArray(rewriteSize)];
int rewriteIndex = 0;
-
// Fill in what we can now
// opcode
newRewrite[rewriteIndex++] = byteCode.getOpcode();
-
// padding
for (int index = 0; index < padLength; index++) {
newRewrite[rewriteIndex++] = 0;
}
-
// defaultbyte
// This gets overwritten by fixUpByteCodeTargets
newRewrite[rewriteIndex++] = -1;
newRewrite[rewriteIndex++] = -1;
newRewrite[rewriteIndex++] = -1;
newRewrite[rewriteIndex++] = -1;
-
// lowbyte
final int lowbyteIndex = rewriteIndex;
setRewrite4Bytes(lowValue, lowbyteIndex, newRewrite);
rewriteIndex += 4;
-
// highbyte
final int highbyteIndex = rewriteIndex;
setRewrite4Bytes(highValue, highbyteIndex, newRewrite);
rewriteIndex += 4;
-
// jump offsets
// The case_pcs will get overwritten by fixUpByteCodeTargets
for (int index = 0; index < caseCount; index++) {
diff --git a/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java b/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java
index 3c5cb2e69..c3fce2d29 100644
--- a/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java
+++ b/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java
@@ -45,7 +45,7 @@ void test() throws Pack200Exception {
final int[] labels = { 0 };
final int[] empty = {};
// The OperandManager requires all 21 band arrays.
- // Most can be empty for this PoC.
+ // Most can be empty for this test.
final OperandManager om = new OperandManager(caseCount, empty, empty, empty, empty, labels, empty, empty, empty, empty, empty, empty, empty, empty,
empty, empty, empty, empty, empty, empty, empty);
final ByteCode bc = ByteCode.getByteCode(171); // lookupswitch
diff --git a/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java b/src/test/java/org/apache/commons/compress/harmony/unpack200/TableSwitchFormTest.java
similarity index 73%
copy from src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java
copy to src/test/java/org/apache/commons/compress/harmony/unpack200/TableSwitchFormTest.java
index 3c5cb2e69..a8fce0a56 100644
--- a/src/test/java/org/apache/commons/compress/harmony/unpack200/LookupSwitchFormTest.java
+++ b/src/test/java/org/apache/commons/compress/harmony/unpack200/TableSwitchFormTest.java
@@ -24,16 +24,16 @@
import org.apache.commons.compress.harmony.pack200.Pack200Exception;
import org.apache.commons.compress.harmony.unpack200.bytecode.ByteCode;
import org.apache.commons.compress.harmony.unpack200.bytecode.OperandManager;
-import org.apache.commons.compress.harmony.unpack200.bytecode.forms.LookupSwitchForm;
+import org.apache.commons.compress.harmony.unpack200.bytecode.forms.TableSwitchForm;
import org.junit.jupiter.api.Test;
/**
- * Tests {@link LookupSwitchForm}.
+ * Tests {@link TableSwitchForm}.
*/
-class LookupSwitchFormTest {
+class TableSwitchFormTest {
/**
- * Run with {@copde -Xmx64m} too get a Pack200Exception(MemoryLimitException).
+ * Run with {@code -Xmx64m} to get a Pack200Exception(MemoryLimitException).
*
* @throws Pack200Exception
*/
@@ -43,13 +43,14 @@ void test() throws Pack200Exception {
final int[] caseCount = { large };
// Provide a dummy label for the defaultPc branch taken before the allocation.
final int[] labels = { 0 };
+ final int[] caseValues = { 0 }; // TableSwitch needs at least one case value.
final int[] empty = {};
// The OperandManager requires all 21 band arrays.
- // Most can be empty for this PoC.
- final OperandManager om = new OperandManager(caseCount, empty, empty, empty, empty, labels, empty, empty, empty, empty, empty, empty, empty, empty,
+ // Most can be empty for this test.
+ final OperandManager om = new OperandManager(caseCount, caseValues, empty, empty, empty, labels, empty, empty, empty, empty, empty, empty, empty, empty,
empty, empty, empty, empty, empty, empty, empty);
- final ByteCode bc = ByteCode.getByteCode(171); // lookupswitch
- // Run with -Xmx64m too get a Pack200Exception(MemoryLimitException).
- assertThrows(Exception.class, () -> new LookupSwitchForm(171, "lookupswitch").setByteCodeOperands(bc, om, 0));
+ final ByteCode bc = ByteCode.getByteCode(170); // tableswitch
+ // Run with -Xmx64m to get a Pack200Exception(MemoryLimitException).
+ assertThrows(Exception.class, () -> new TableSwitchForm(170, "tableswitch").setByteCodeOperands(bc, om, 0));
}
}