Skip to content

Commit 8ba6d43

Browse files
lvydrabeikov
authored andcommitted
[HHH-16772] Generated bytecode for HibernateAccessOptimizer class is invalid and causes operand stack overflow issue
1 parent df8745a commit 8ba6d43

File tree

4 files changed

+70
-1
lines changed

4 files changed

+70
-1
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,10 @@ public Size apply(
537537
);
538538
}
539539
methodVisitor.visitInsn( Opcodes.RETURN );
540-
return new Size( 2, instrumentedMethod.getStackSize() );
540+
return new Size(
541+
is64BitType( type ) ? 3 : 2,
542+
instrumentedMethod.getStackSize()
543+
);
541544
}
542545

543546
private int getLoadOpCode(Class<?> type) {
@@ -554,6 +557,10 @@ private int getLoadOpCode(Class<?> type) {
554557
}
555558
return Opcodes.ALOAD;
556559
}
560+
561+
private boolean is64BitType(Class<?> type) {
562+
return type == long.class || type == double.class;
563+
}
557564
}
558565

559566
private List<ForeignPackageClassInfo> createForeignPackageClassInfos(Class<?> clazz) {

hibernate-core/src/test/java/org/hibernate/bytecode/internal/bytebuddy/GenerateProxiesTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@
66
import java.io.IOException;
77
import java.lang.reflect.InvocationTargetException;
88

9+
import java.util.LinkedHashMap;
10+
import java.util.Map;
911
import org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl;
1012
import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext;
1113
import org.hibernate.bytecode.enhance.spi.EnhancementException;
1214
import org.hibernate.bytecode.enhance.spi.Enhancer;
1315
import org.hibernate.bytecode.spi.ByteCodeHelper;
1416
import org.hibernate.bytecode.spi.ReflectionOptimizer;
17+
import org.hibernate.property.access.internal.PropertyAccessStrategyFieldImpl;
18+
import org.hibernate.property.access.spi.PropertyAccess;
1519
import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper;
20+
import org.hibernate.testing.orm.junit.JiraKey;
1621
import org.junit.Test;
1722

1823
public class GenerateProxiesTest {
@@ -43,6 +48,29 @@ public void generateFastClassAndReflectionOptimizer() {
4348
assertNotNull( reflectionOptimizer.getInstantiationOptimizer().newInstance() );
4449
}
4550

51+
@Test
52+
@JiraKey("HHH-16772")
53+
public void generateFastMappedSuperclassAndReflectionOptimizer() {
54+
BytecodeProviderImpl bytecodeProvider = new BytecodeProviderImpl();
55+
final Map<String, PropertyAccess> propertyAccessMap = new LinkedHashMap<>();
56+
57+
final PropertyAccessStrategyFieldImpl propertyAccessStrategy = new PropertyAccessStrategyFieldImpl();
58+
59+
propertyAccessMap.put(
60+
"timestamp",
61+
propertyAccessStrategy.buildPropertyAccess(MappedSuperclassEntity.class, "value", true )
62+
);
63+
64+
ReflectionOptimizer reflectionOptimizer = bytecodeProvider.getReflectionOptimizer(
65+
MappedSuperclassEntity.class,
66+
propertyAccessMap
67+
);
68+
69+
assertNotNull(reflectionOptimizer);
70+
assertEquals( 1, reflectionOptimizer.getAccessOptimizer().getPropertyNames().length );
71+
assertNotNull( reflectionOptimizer.getInstantiationOptimizer().newInstance() );
72+
}
73+
4674
@Test
4775
public void generateEnhancedClass() throws EnhancementException, IOException {
4876
Enhancer enhancer = new EnhancerImpl( new DefaultEnhancementContext(), new ByteBuddyState() );
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.bytecode.internal.bytebuddy;
8+
9+
import jakarta.persistence.Entity;
10+
import org.hibernate.bytecode.internal.bytebuddy.mappedsuperclass.BaseMappedSuperclass;
11+
12+
@Entity
13+
public class MappedSuperclassEntity extends BaseMappedSuperclass {
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.bytecode.internal.bytebuddy.mappedsuperclass;
8+
9+
import jakarta.persistence.Id;
10+
import jakarta.persistence.MappedSuperclass;
11+
12+
@MappedSuperclass
13+
public abstract class BaseMappedSuperclass {
14+
15+
@Id
16+
protected Long id;
17+
18+
protected long value;
19+
}

0 commit comments

Comments
 (0)