aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorchibash <chiba@javassist.org>2022-08-07 03:01:40 +0900
committerchibash <chiba@javassist.org>2022-08-07 03:01:40 +0900
commit4f35e4e1a8c76fa7da07a92674ffddd5c4c27ec0 (patch)
treee80a7204fbc4e4e428dd69887248e564b560b159 /src
parent7bbf0d4244011baa0dfb6f5116b659cab514cc9a (diff)
downloadjavassist-4f35e4e1a8c76fa7da07a92674ffddd5c4c27ec0.tar.gz
javassist-4f35e4e1a8c76fa7da07a92674ffddd5c4c27ec0.zip
prohibits too many items from being added to a constant pool
Diffstat (limited to 'src')
-rw-r--r--src/main/javassist/bytecode/ConstPool.java3
-rw-r--r--src/test/javassist/JvstTest5.java14
2 files changed, 17 insertions, 0 deletions
diff --git a/src/main/javassist/bytecode/ConstPool.java b/src/main/javassist/bytecode/ConstPool.java
index 1ce26b3e..b5113e42 100644
--- a/src/main/javassist/bytecode/ConstPool.java
+++ b/src/main/javassist/bytecode/ConstPool.java
@@ -1433,6 +1433,9 @@ public final class ConstPool
*/
public void write(DataOutputStream out) throws IOException
{
+ if (numOfItems < 0 || Short.MAX_VALUE < numOfItems)
+ throw new IOException("too many constant pool items " + numOfItems);
+
out.writeShort(numOfItems);
LongVector v = items;
int size = numOfItems;
diff --git a/src/test/javassist/JvstTest5.java b/src/test/javassist/JvstTest5.java
index ade41e8c..39af16b9 100644
--- a/src/test/javassist/JvstTest5.java
+++ b/src/test/javassist/JvstTest5.java
@@ -15,6 +15,7 @@ import javassist.expr.ExprEditor;
import javassist.expr.Handler;
import javassist.expr.MethodCall;
import javassist.expr.NewExpr;
+import junit.framework.Assert;
@SuppressWarnings({"rawtypes","unchecked","unused"})
public class JvstTest5 extends JvstTestRoot {
@@ -574,4 +575,17 @@ public class JvstTest5 extends JvstTestRoot {
Object obj = make(cc.getName());
assertEquals(1, invoke(obj, "run"));
}
+
+ public void testTooManyConstPoolItems() throws Exception {
+ CtClass cc = sloader.makeClass("TooManyConstPoolItems");
+ ClassFile cf = cc.getClassFile();
+ ConstPool cPool = cf.getConstPool();
+ for (int i = 0; i <= 65527; i++)
+ cPool.addIntegerInfo(i);
+ try {
+ cc.writeFile();
+ fail("too many items were accepted");
+ }
+ catch (CannotCompileException e) {}
+ }
}