]> source.dussan.org Git - javassist.git/commitdiff
Fix insertAuxInitializer may cause inconsistent stack height problem 469/head
authorshifujun <shifujun@foxmail.com>
Mon, 11 Dec 2023 09:52:52 +0000 (17:52 +0800)
committershifujun <shifujun@foxmail.com>
Mon, 11 Dec 2023 09:53:08 +0000 (17:53 +0800)
Usually, constructor only load super class's constructor's init params into stack.
After this() or super() called, stack will be empty. If so, we insertAuxInitializer
right after this() or super() can reuse max stack size if it enough.

But, there is some weird class out there, their constructors load all in-constructor
init field value into stack before this() or super() call. In this case,
after this() or super() call, stack is not empty, even maybe full.

In summary, insertAuxInitializer should increase MaxStack anyway.

src/main/javassist/CtClassType.java

index 22b873a6921b1d8a41dcf4a3d7b466cf4c944ca2..f4345e0a64925255bf6c2cad4c455e92d9d24a01 100644 (file)
@@ -1763,8 +1763,7 @@ class CtClassType extends CtClass {
         int pos = it.insertEx(initializer.get());
         it.insert(initializer.getExceptionTable(), pos);
         int maxstack = codeAttr.getMaxStack();
-        if (maxstack < stacksize)
-            codeAttr.setMaxStack(stacksize);
+        codeAttr.setMaxStack(maxstack + stacksize);
     }
 
     private int makeFieldInitializer(Bytecode code, CtClass[] parameters)