diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
index 8308d1adfd..c8ea26d29a 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
@@ -1,6 +1,5 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -23,6 +22,7 @@ package com.sun.org.apache.bcel.internal.classfile;
import com.sun.org.apache.bcel.internal.Constants;
+import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import java.io.*;
/**
@@ -36,6 +36,7 @@ import java.io.*;
* @see Constant
* @see com.sun.org.apache.bcel.internal.generic.ConstantPoolGen
* @author M. Dahm
+ * @LastModified: May 2022
*/
public class ConstantPool implements Cloneable, Node, Serializable {
private int constant_pool_count;
@@ -190,9 +191,16 @@ public class ConstantPool implements Cloneable, Node, Serializable {
*/
public void dump(DataOutputStream file) throws IOException
{
- file.writeShort(constant_pool_count);
+ /*
+ * Constants over the size of the constant pool shall not be written out.
+ * This is a redundant measure as the ConstantPoolGen should have already
+ * reported an error back in the situation.
+ */
+ int size = constant_pool_count < ConstantPoolGen.CONSTANT_POOL_SIZE - 1 ?
+ constant_pool_count : ConstantPoolGen.CONSTANT_POOL_SIZE - 1;
- for(int i=1; i < constant_pool_count; i++)
+ file.writeShort(size);
+ for(int i=1; i < size; i++)
if(constant_pool[i] != null)
constant_pool[i].dump(file);
}
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java b/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
index 4eb12e2e69..bdd25a6417 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
@@ -1,6 +1,5 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -38,8 +37,10 @@ import java.util.HashMap;
*
* @author M. Dahm
* @see Constant
+ * @LastModified: May 2022
*/
public class ConstantPoolGen implements java.io.Serializable {
+ public static final int CONSTANT_POOL_SIZE = 65536;
protected int size = 1024; // Inital size, sufficient in most cases
protected Constant[] constants = new Constant[size];
protected int index = 1; // First entry (0) used by JVM
@@ -61,7 +62,7 @@ public class ConstantPoolGen implements java.io.Serializable {
*/
public ConstantPoolGen(Constant[] cs) {
if(cs.length > size) {
- size = cs.length;
+ size = Math.min(cs.length, CONSTANT_POOL_SIZE);
constants = new Constant[size];
}
@@ -134,10 +135,19 @@ public class ConstantPoolGen implements java.io.Serializable {
/** Resize internal array of constants.
*/
protected void adjustSize() {
+ // 3 extra spaces are needed as some entries may take 3 slots
+ if (index + 3 >= CONSTANT_POOL_SIZE) {
+ throw new RuntimeException("The number of constants " + (index + 3) +
+ " is over the size of the constant pool: " +
+ (CONSTANT_POOL_SIZE - 1));
+ }
+
if(index + 3 >= size) {
Constant[] cs = constants;
size *= 2;
+ // the constant array shall not exceed the size of the constant pool
+ size = Math.min(size, CONSTANT_POOL_SIZE);
constants = new Constant[size];
System.arraycopy(cs, 0, constants, 0, index);
}