From 6f892a5354bd5063418d74e32ded9653d24a768d Mon Sep 17 00:00:00 2001 From: Aleksei Voitylov Date: Mon, 30 May 2022 12:26:00 +0000 Subject: [PATCH] 8285407: Improve Xalan supports Reviewed-by: yan Backport-of: fd6385d8c20379c1139f64f5c90d331ad9631097 --- .../bcel/internal/classfile/ConstantPool.java | 16 ++++++++++++---- .../bcel/internal/generic/ConstantPoolGen.java | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) 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 091e70cbfb..72bdb43918 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. */ package com.sun.org.apache.bcel.internal.classfile; @@ -59,6 +58,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.*; /** @@ -72,6 +72,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; @@ -226,9 +227,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 1b53aeb5b6..95e9920981 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. */ package com.sun.org.apache.bcel.internal.generic; @@ -74,8 +73,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 @@ -97,7 +98,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]; } @@ -170,10 +171,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); }