Skip to content

Commit 0af4a21

Browse files
committed
HHH-18976 Forbid any future new uses of Arrays#copyOf(Object[], int)
Because it uses Array#newInstance under the hood, and we forbid the use of *that*.
1 parent 77a97a9 commit 0af4a21

File tree

12 files changed

+30
-7
lines changed

12 files changed

+30
-7
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.time.OffsetTime;
1313
import java.time.ZonedDateTime;
1414
import java.util.ArrayList;
15-
import java.util.Arrays;
1615
import java.util.Collection;
1716
import java.util.HashSet;
1817
import java.util.List;
@@ -69,6 +68,7 @@
6968
import org.hibernate.engine.config.spi.ConfigurationService;
7069
import org.hibernate.engine.config.spi.StandardConverters;
7170
import org.hibernate.engine.jdbc.spi.JdbcServices;
71+
import org.hibernate.internal.util.collections.ArrayHelper;
7272
import org.hibernate.mapping.Table;
7373
import org.hibernate.models.internal.MutableClassDetailsRegistry;
7474
import org.hibernate.models.spi.ClassDetails;
@@ -876,7 +876,7 @@ private static void adaptToPreferredSqlTypeCode(
876876
jdbcTypeRegistry.getDescriptor( preferredSqlTypeCode ),
877877
name
878878
);
879-
final String[] keys = Arrays.copyOf( additionalKeys, additionalKeys.length + 2 );
879+
final String[] keys = ArrayHelper.copyOf( additionalKeys, additionalKeys.length + 2 );
880880
keys[additionalKeys.length] = javaType.getSimpleName();
881881
keys[additionalKeys.length + 1] = javaType.getName();
882882
basicTypeRegistry.register( basicType, keys );

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/CompositeOwnerTracker.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.Arrays;
88

99
import org.hibernate.engine.spi.CompositeOwner;
10+
import org.hibernate.internal.build.AllowReflection;
11+
import org.hibernate.internal.util.collections.ArrayHelper;
1012

1113
/**
1214
* small low memory class to keep references to composite owners
@@ -23,14 +25,15 @@ public CompositeOwnerTracker() {
2325
owners = new CompositeOwner[0];
2426
}
2527

28+
@AllowReflection // Possible array types are registered in org.hibernate.graalvm.internal.StaticClassLists.typesNeedingArrayCopy
2629
public void add(String name, CompositeOwner owner) {
2730
for ( int i = 0; i < names.length; i++ ) {
2831
if ( names[i].equals( name ) ) {
2932
owners[i] = owner;
3033
return;
3134
}
3235
}
33-
names = Arrays.copyOf( names, names.length + 1 );
36+
names = ArrayHelper.copyOf( names, names.length + 1 );
3437
names[names.length - 1] = name;
3538
owners = Arrays.copyOf( owners, owners.length + 1 );
3639
owners[owners.length - 1] = owner;
@@ -44,11 +47,12 @@ public void callOwner(String fieldName) {
4447
}
4548
}
4649

50+
@AllowReflection
4751
public void removeOwner(String name) {
4852
for ( int i = 0; i < names.length; i++ ) {
4953
if ( name.equals( names[i] ) ) {
5054

51-
final String[] newNames = Arrays.copyOf( names, names.length - 1 );
55+
final String[] newNames = ArrayHelper.copyOf( names, names.length - 1 );
5256
System.arraycopy( names, i + 1, newNames, i, newNames.length - i);
5357
names = newNames;
5458

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleFieldTracker.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
package org.hibernate.bytecode.enhance.internal.tracker;
66

7-
import java.util.Arrays;
8-
97
import org.hibernate.internal.util.collections.ArrayHelper;
108

119
/**
@@ -31,7 +29,7 @@ public void add(String name) {
3129
return;
3230
}
3331
if ( !contains( name ) ) {
34-
names = Arrays.copyOf( names, names.length + 1 );
32+
names = ArrayHelper.copyOf( names, names.length + 1 );
3533
names[names.length - 1] = name;
3634
}
3735
}

hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,7 @@ private static class CustomArrayList extends AbstractCollection<Object> implemen
15461546
Object[] array = ArrayHelper.EMPTY_OBJECT_ARRAY;
15471547
int size;
15481548

1549+
@AllowReflection
15491550
public void ensureCapacity(int minCapacity) {
15501551
int oldCapacity = array.length;
15511552
if ( minCapacity > oldCapacity ) {
@@ -1608,6 +1609,7 @@ public Object next() {
16081609
}
16091610

16101611
@Override
1612+
@AllowReflection
16111613
public Object[] toArray() {
16121614
return Arrays.copyOf( array, size );
16131615
}

hibernate-core/src/main/java/org/hibernate/engine/internal/SessionEventListenerManagerImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.hibernate.SessionEventListener;
1313
import org.hibernate.engine.spi.SessionEventListenerManager;
14+
import org.hibernate.internal.build.AllowReflection;
1415

1516
/**
1617
* @author Steve Ebersole
@@ -30,6 +31,7 @@ public SessionEventListenerManagerImpl(List<SessionEventListener> initialListene
3031
}
3132

3233
@Override
34+
@AllowReflection
3335
public void addListener(final SessionEventListener... additionalListeners) {
3436
Objects.requireNonNull( additionalListeners );
3537
final SessionEventListener[] existing = this.listeners;

hibernate-core/src/main/java/org/hibernate/internal/util/collections/StandardStack.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package org.hibernate.internal.util.collections;
66

7+
import org.hibernate.internal.build.AllowReflection;
8+
79
import java.util.Arrays;
810
import java.util.NoSuchElementException;
911
import java.util.function.BiFunction;
@@ -142,6 +144,7 @@ public <X, Y> X findCurrentFirstWithParameter(Y parameter, BiFunction<T, Y, X> b
142144
return null;
143145
}
144146

147+
@AllowReflection
145148
private void grow() {
146149
final int oldCapacity = elements.length;
147150
final int jump = ( oldCapacity < 64 ) ? ( oldCapacity + 2 ) : ( oldCapacity >> 1 );

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ protected Object[] toIdArray(List<Object> ids) {
200200
return ids.toArray( idArray );
201201
}
202202

203+
@AllowReflection
203204
protected Object[] toIdArray(Object[] ids) {
204205
if ( ids.getClass().equals( idArray.getClass() ) ) {
205206
return ids;

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiKeyLoadHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.hibernate.dialect.Dialect;
88
import org.hibernate.engine.spi.SessionFactoryImplementor;
9+
import org.hibernate.internal.build.AllowReflection;
910
import org.hibernate.metamodel.mapping.JdbcMapping;
1011
import org.hibernate.type.BasicType;
1112
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
@@ -74,6 +75,7 @@ static boolean hasSingleId(Object[] ids) {
7475
return true;
7576
}
7677

78+
@AllowReflection
7779
static Object[] trimIdBatch(int length, Object[] keysToInitialize) {
7880
int newLength = length;
7981
while ( newLength>1 && keysToInitialize[newLength-1] == null ) {

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/TableSet.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Arrays;
88
import java.util.BitSet;
99

10+
import org.hibernate.internal.build.AllowReflection;
1011
import org.hibernate.sql.model.TableMapping;
1112

1213
/**
@@ -68,6 +69,7 @@ private boolean addForChecks(final TableMapping tableMapping) {
6869
}
6970

7071
//Meant for assertions only
72+
@AllowReflection
7173
private void ensureCapacity(final int position) {
7274
final int increments = 3; //Needs to be at least 1.
7375
if ( checks == null ) {

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesResultSetImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1818
import org.hibernate.exception.DataException;
1919
import org.hibernate.exception.LockTimeoutException;
20+
import org.hibernate.internal.build.AllowReflection;
2021
import org.hibernate.query.spi.Limit;
2122
import org.hibernate.query.spi.QueryOptions;
2223
import org.hibernate.sql.ast.spi.SqlSelection;
@@ -346,6 +347,7 @@ public boolean usesFollowOnLocking() {
346347
}
347348

348349
@Override
350+
@AllowReflection
349351
public void finishRowProcessing(RowProcessingState rowProcessingState, boolean wasAdded) {
350352
if ( queryCachePutManager != null ) {
351353
if ( wasAdded ) {

0 commit comments

Comments
 (0)