This is an automated email from the ASF dual-hosted git repository.
nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new e58ce26400d IGNITE-28946 Apply class name filter always (#13436)
e58ce26400d is described below
commit e58ce26400d062070a2ac99bfb9fb639fd368955
Author: Nikolay <[email protected]>
AuthorDate: Thu Aug 6 14:48:16 2026 +0300
IGNITE-28946 Apply class name filter always (#13436)
---
.../ignite/internal/binary/BinaryContext.java | 9 +-
.../apache/ignite/internal/binary/BinaryUtils.java | 15 +-
.../internal/marshaller/ClassLoaderUtils.java | 209 +++++++++++++++++++++
.../ignite/internal/binary/BinaryReaderExImpl.java | 6 +-
.../internal/binary/builder/BinaryBuilderEnum.java | 5 +-
.../binary/builder/BinaryEnumArrayLazyValue.java | 5 +-
.../binary/builder/BinaryObjectArrayLazyValue.java | 5 +-
.../binary/builder/BinaryObjectBuilderImpl.java | 4 +-
.../optimized/OptimizedMarshallerImpl.java | 26 +--
.../optimized/OptimizedMarshallerUtils.java | 4 +-
.../optimized/OptimizedObjectInputStream.java | 14 +-
.../jdk/JdkMarshallerObjectInputStream.java | 6 +-
.../query/calcite/externalize/RelJson.java | 4 +-
.../apache/ignite/internal/util/CommonUtils.java | 188 ++----------------
.../ignite/internal/IgniteComponentType.java | 3 +-
.../org/apache/ignite/internal/IgniteKernal.java | 3 +-
.../ignite/internal/MarshallerContextImpl.java | 3 +-
.../internal/jdbc/thin/JdbcThinConnection.java | 3 +-
.../managers/deployment/GridDeployment.java | 5 +-
.../deployment/GridDeploymentLocalStore.java | 3 +-
.../deployment/GridDeploymentPerVersionStore.java | 5 +-
.../client/compute/ClientExecuteTaskRequest.java | 3 +-
.../processors/platform/utils/PlatformUtils.java | 3 +-
.../processors/query/GridQueryProcessor.java | 3 +-
.../processors/query/QueryTypeDescriptorImpl.java | 3 +-
.../internal/processors/query/QueryUtils.java | 11 +-
.../rest/protocols/tcp/GridTcpRestNioListener.java | 3 +-
.../processors/security/IgniteSecurityAdapter.java | 4 +-
.../processors/task/GridTaskProcessor.java | 3 +-
.../apache/ignite/internal/util/IgniteUtils.java | 28 ---
.../spi/deployment/local/LocalDeploymentSpi.java | 3 +-
.../class_list_exploit_excluded_jobs_included.txt | 19 ++
.../class_list_exploit_with_jobs_included.txt | 23 +++
.../binary/RawBinaryObjectExtractorTest.java | 3 +-
.../optimized/OptimizedMarshallerTest.java | 3 +-
.../optimized/OptimizedObjectStreamSelfTest.java | 2 +-
.../ignite/p2p/P2PScanQueryUndeployTest.java | 4 +-
...rMetricsSnapshotSerializeCompatibilityTest.java | 3 +-
.../SocketStreamerUnmarshalVulnerabilityTest.java | 37 ++--
.../testframework/junits/GridAbstractTest.java | 3 +-
.../processors/query/h2/dml/UpdatePlanBuilder.java | 3 +-
.../protocols/http/jetty/GridJettyRestHandler.java | 3 +-
.../internal/client/thin/TcpIgniteClient.java | 5 +-
43 files changed, 386 insertions(+), 311 deletions(-)
diff --git
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
index f00e26fb26a..a4a7de22b8b 100644
---
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
+++
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
@@ -63,6 +63,7 @@ import org.apache.ignite.binary.BinaryTypeConfiguration;
import org.apache.ignite.internal.DuplicateTypeIdException;
import org.apache.ignite.internal.UnregisteredBinaryTypeException;
import org.apache.ignite.internal.UnregisteredClassException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
import org.apache.ignite.internal.util.CommonUtils;
import org.apache.ignite.internal.util.lang.GridMapEntry;
@@ -372,7 +373,7 @@ public class BinaryContext {
String affField = affFields.remove(clsName0);
if (affField == null) {
- Class<?> cls = CommonUtils.classForName(clsName0,
null);
+ Class<?> cls =
ClassLoaderUtils.classForName(clsName0);
if (cls != null)
affField = affFldNameProvider.apply(cls);
@@ -386,7 +387,7 @@ public class BinaryContext {
String affField = affFields.remove(clsName);
if (affField == null) {
- Class<?> cls = CommonUtils.classForName(clsName, null);
+ Class<?> cls = ClassLoaderUtils.classForName(clsName);
if (cls != null)
affField = affFldNameProvider.apply(cls);
@@ -740,7 +741,7 @@ public class BinaryContext {
if (clsName == null)
throw new ClassNotFoundException("Unknown type ID: " +
typeId);
- cls = CommonUtils.forName(clsName, ldr, null,
Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(clsName, ldr);
desc = descByCls.get(cls);
@@ -1496,7 +1497,7 @@ public class BinaryContext {
optmMarsh.onUndeploy(ldr);
- CommonUtils.clearClassCache(ldr);
+ ClassLoaderUtils.clearClassCache(ldr);
}
/**
diff --git
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index 14a97520c81..e10222a6593 100644
---
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -79,6 +79,7 @@ import org.apache.ignite.cache.affinity.AffinityKeyMapped;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.internal.binary.streams.BinaryInputStream;
import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.util.CommonUtils;
import org.apache.ignite.internal.util.MutableSingletonList;
@@ -1632,17 +1633,16 @@ public class BinaryUtils {
cls = ctx.descriptorForTypeId(true, typeId, ldr,
false).describedClass();
else {
String clsName = doReadClassName(in);
- boolean useCache = Marshallers.USE_CACHE.get();
try {
- cls = CommonUtils.forName(clsName, ldr, null,
Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(clsName, ldr);
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsName, e);
}
// forces registering of class by type id, at least locally
- if (useCache)
+ if (Marshallers.USE_CACHE.get())
ctx.registerType(cls, false, false);
}
@@ -1666,7 +1666,7 @@ public class BinaryUtils {
cls = ctx.descriptorForTypeId(true, typeId, ldr,
registerMeta).describedClass();
else {
try {
- cls = CommonUtils.forName(clsName, ldr, null,
Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(clsName, ldr);
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsName, e);
@@ -1719,10 +1719,9 @@ public class BinaryUtils {
* Having target class in place we simply read ordinal and create final
representation.
*
* @param cls Enum class.
- * @param useCache True if class loader cache will be used, false
otherwise.
* @return Value.
*/
- static Enum<?> doReadEnum(BinaryInputStream in, Class<?> cls, boolean
useCache) throws BinaryObjectException {
+ static Enum<?> doReadEnum(BinaryInputStream in, Class<?> cls) throws
BinaryObjectException {
assert cls != null;
if (!cls.isEnum())
@@ -1730,7 +1729,7 @@ public class BinaryUtils {
int ord = in.readInt();
- if (useCache)
+ if (Marshallers.USE_CACHE.get())
return BinaryEnumCache.get(cls, ord);
else
return uncachedEnumValue(cls, ord);
@@ -1773,7 +1772,7 @@ public class BinaryUtils {
if (flag == GridBinaryMarshaller.NULL)
arr[i] = null;
else
- arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr),
Marshallers.USE_CACHE.get());
+ arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr));
}
return arr;
diff --git
a/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
b/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
new file mode 100644
index 00000000000..9c6be55dd34
--- /dev/null
+++
b/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.internal.marshaller;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
+import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.marshaller.MarshallerUtils;
+import org.apache.ignite.marshaller.Marshallers;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Utility class to deal with class loading.
+ * Contains internal class cache.
+ */
+public class ClassLoaderUtils {
+ /** Primitive class map. */
+ private static final Map<String, Class<?>> primitiveMap = new
HashMap<>(16, .5f);
+
+ /** */
+ private static final ConcurrentMap<ClassLoader, ConcurrentMap<String,
Class<?>>> classCache =
+ new ConcurrentHashMap<>();
+
+ static {
+ primitiveMap.put("byte", byte.class);
+ primitiveMap.put("short", short.class);
+ primitiveMap.put("int", int.class);
+ primitiveMap.put("long", long.class);
+ primitiveMap.put("float", float.class);
+ primitiveMap.put("double", double.class);
+ primitiveMap.put("char", char.class);
+ primitiveMap.put("boolean", boolean.class);
+ primitiveMap.put("void", void.class);
+ }
+
+ /**
+ * Gets class for the given name if it can be loaded or {@code null}.
+ *
+ * @param cls Class.
+ * @return Class or {@code null} if it can't be found.
+ */
+ @Nullable public static Class<?> classForName(@Nullable String cls) {
+ return classForName(cls, false);
+ }
+
+ /**
+ * Gets class for the given name if it can be loaded or {@code null}.
+ *
+ * @param cls Class.
+ * @return Class or {@code null} if it can't be found.
+ */
+ @Nullable public static Class<?> classForNameWithPrimitives(@Nullable
String cls) {
+ return classForName(cls, true);
+ }
+
+ /**
+ * Gets class for the given name if it can be loaded or default given
class.
+ *
+ * @param cls Class.
+ * @param includePrimitiveTypes Whether class resolution should include
primitive types
+ * (i.e. "int" will resolve to int.class if
flag is set)
+ * @return Class or default given class if it can't be found.
+ */
+ @Nullable private static Class<?> classForName(
+ @Nullable String cls,
+ boolean includePrimitiveTypes
+ ) {
+ Class<?> clazz;
+ if (cls == null)
+ return null;
+ else if (!includePrimitiveTypes || cls.length() > 7 || (clazz =
primitiveMap.get(cls)) == null) {
+ try {
+ return Class.forName(cls);
+ }
+ catch (ClassNotFoundException ignore) {
+ return null;
+ }
+ }
+ return clazz;
+ }
+
+ /**
+ * Gets class for provided name. Accepts primitive types names.
+ *
+ * @param clsName Class name.
+ * @param ldr Class loader.
+ * @param useCache If true class loader and result should be cached
internally, false otherwise.
+ * @return Class.
+ * @throws ClassNotFoundException If class not found.
+ */
+ public static Class<?> forName(
+ String clsName,
+ @Nullable ClassLoader ldr,
+ boolean useCache
+ ) throws ClassNotFoundException {
+ assert clsName != null;
+
+ Class<?> cls = primitiveMap.get(clsName);
+
+ if (cls != null)
+ return cls;
+
+ ldr = ldr != null ? ldr : CommonUtils.gridClassLoader();
+
+ if (!useCache) {
+ cls = Class.forName(clsName, true, ldr);
+
+ return cls;
+ }
+
+ ConcurrentMap<String, Class<?>> ldrMap = classCache.get(ldr);
+
+ if (ldrMap == null) {
+ ConcurrentMap<String, Class<?>> old = classCache.putIfAbsent(ldr,
ldrMap = new ConcurrentHashMap<>());
+
+ if (old != null)
+ ldrMap = old;
+ }
+
+ cls = ldrMap.get(clsName);
+
+ if (cls == null) {
+ if (!MarshallerUtils.classNameFilter().apply(clsName))
+ throw new ClassNotFoundException("Deserialization of class " +
clsName + " is disallowed.");
+
+ // Avoid class caching inside Class.forName
+ if (ldr instanceof CacheClassLoaderMarker)
+ cls = ldr.loadClass(clsName);
+ else
+ cls = Class.forName(clsName, true, ldr);
+
+ Class<?> old = ldrMap.putIfAbsent(clsName, cls);
+
+ if (old != null)
+ cls = old;
+ }
+
+ return cls;
+ }
+
+ /**
+ * Gets class for provided name. Accepts primitive types names.
+ *
+ * @param clsName Class name.
+ * @param ldr Class loader.
+ * @return Class.
+ * @throws ClassNotFoundException If class not found.
+ */
+ public static Class<?> forName(String clsName, @Nullable ClassLoader ldr)
throws ClassNotFoundException {
+ return forName(clsName, ldr, Marshallers.USE_CACHE.get());
+ }
+
+ /**
+ * Gets class for provided name. Accepts primitive types names.
+ *
+ * @param clsName Class name.
+ * @return Class.
+ * @throws ClassNotFoundException If class not found.
+ */
+ public static Class<?> forName(String clsName) throws
ClassNotFoundException {
+ return forName(clsName, null, Marshallers.USE_CACHE.get());
+ }
+
+ /**
+ * Clears class associated with provided class loader from class cache.
+ *
+ * @param ldr Class loader.
+ * @param clsName Class name of clearing class.
+ */
+ public static void clearClassFromClassCache(ClassLoader ldr, String
clsName) {
+ ConcurrentMap<String, Class<?>> map = classCache.get(ldr);
+
+ if (map != null)
+ map.remove(clsName);
+ }
+
+ /**
+ * Clears class cache for provided loader.
+ *
+ * @param ldr Class loader.
+ */
+ public static void clearClassCache(ClassLoader ldr) {
+ classCache.remove(ldr);
+ }
+
+ /**
+ * Completely clears class cache.
+ */
+ public static void clearClassCache() {
+ classCache.clear();
+ }
+}
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
index fca203666fe..888494a185c 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
@@ -43,7 +43,6 @@ import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.SB;
-import org.apache.ignite.marshaller.Marshallers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -1404,7 +1403,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
if (cls == null)
cls = cls0;
- return BinaryUtils.doReadEnum(in, cls,
Marshallers.USE_CACHE.get());
+ return BinaryUtils.doReadEnum(in, cls);
}
else
return null;
@@ -1927,8 +1926,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
break;
case ENUM:
- obj = BinaryUtils.doReadEnum(in, BinaryUtils.doReadClass(in,
ctx, ldr),
- Marshallers.USE_CACHE.get());
+ obj = BinaryUtils.doReadEnum(in, BinaryUtils.doReadClass(in,
ctx, ldr));
break;
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
index 4fc65707b16..ee60218d0b1 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
@@ -20,8 +20,7 @@ package org.apache.ignite.internal.binary.builder;
import org.apache.ignite.binary.BinaryInvalidTypeException;
import org.apache.ignite.internal.binary.BinaryWriterEx;
import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
/**
*
@@ -58,7 +57,7 @@ class BinaryBuilderEnum implements
BinaryBuilderSerializationAware {
Class cls;
try {
- cls = CommonUtils.forName(reader.readString(),
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(reader.readString(),
reader.binaryContext().classLoader());
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsName, e);
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
index b90d60aa070..630ca685e80 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
@@ -21,8 +21,7 @@ import org.apache.ignite.binary.BinaryInvalidTypeException;
import org.apache.ignite.binary.BinaryObjectException;
import org.apache.ignite.internal.binary.BinaryWriterEx;
import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
/**
*
@@ -51,7 +50,7 @@ class BinaryEnumArrayLazyValue extends
BinaryAbstractLazyValue {
Class cls;
try {
- cls = CommonUtils.forName(reader.readString(),
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(reader.readString(),
reader.binaryContext().classLoader());
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsName, e);
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
index c2110b6099b..008face8a81 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
@@ -20,8 +20,7 @@ package org.apache.ignite.internal.binary.builder;
import org.apache.ignite.binary.BinaryInvalidTypeException;
import org.apache.ignite.internal.binary.BinaryWriterEx;
import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
/**
*
@@ -50,7 +49,7 @@ class BinaryObjectArrayLazyValue extends
BinaryAbstractLazyValue {
Class cls;
try {
- cls = CommonUtils.forName(reader.readString(),
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(reader.readString(),
reader.binaryContext().classLoader());
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsName, e);
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
index 4a4fa0f242f..65c31228303 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
@@ -38,10 +38,10 @@ import org.apache.ignite.internal.binary.BinaryObjectImpl;
import org.apache.ignite.internal.binary.BinaryUtils;
import org.apache.ignite.internal.binary.BinaryWriterEx;
import org.apache.ignite.internal.binary.GridBinaryMarshaller;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.CommonUtils;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.lang.IgniteBiTuple;
-import org.apache.ignite.marshaller.Marshallers;
import org.apache.ignite.thread.IgniteThread;
import org.jetbrains.annotations.Nullable;
@@ -152,7 +152,7 @@ class BinaryObjectBuilderImpl implements
BinaryObjectBuilderEx {
Class cls;
try {
- cls = CommonUtils.forName(clsNameToWrite, ctx.classLoader(),
null, Marshallers.USE_CACHE.get());
+ cls = ClassLoaderUtils.forName(clsNameToWrite,
ctx.classLoader());
}
catch (ClassNotFoundException e) {
throw new BinaryInvalidTypeException("Failed to load the
class: " + clsNameToWrite, e);
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
index 9c5549a29c6..ec917263ecb 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
@@ -26,7 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller;
import org.apache.ignite.marshaller.Marshallers;
@@ -190,29 +190,16 @@ public class OptimizedMarshallerImpl extends
AbstractNodeNameAwareMarshaller imp
/** {@inheritDoc} */
@Override protected <T> T unmarshal0(InputStream in, @Nullable ClassLoader
clsLdr) throws IgniteCheckedException {
- return unmarshal0(in, clsLdr, Marshallers.USE_CACHE.get());
- }
-
- /**
- * Unmarshals object from the input stream using given class loader.
- * This method should not close given input stream.
- *
- * @param <T> Type of unmarshalled object.
- * @param in Input stream.
- * @param clsLdr Class loader to use.
- * @param useCache True if class loader cache will be used, false
otherwise.
- * @return Unmarshalled object.
- * @throws IgniteCheckedException If unmarshalling failed.
- */
- protected <T> T unmarshal0(InputStream in, @Nullable ClassLoader clsLdr,
boolean useCache) throws IgniteCheckedException {
assert in != null;
+ boolean useCache = Marshallers.USE_CACHE.get();
+
OptimizedObjectInputStream objIn = null;
try {
objIn = !useCache ? nonCachedRegistry.in() : registry.in();
- objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr :
dfltClsLdr, useCache);
+ objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr :
dfltClsLdr);
objIn.in().inputStream(in);
@@ -245,8 +232,7 @@ public class OptimizedMarshallerImpl extends
AbstractNodeNameAwareMarshaller imp
try {
objIn = registry.in();
- objIn.context(clsMap, ctx, mapper,
- clsLdr != null ? clsLdr : dfltClsLdr,
Marshallers.USE_CACHE.get());
+ objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr :
dfltClsLdr);
objIn.in().bytes(arr, arr.length);
@@ -305,7 +291,7 @@ public class OptimizedMarshallerImpl extends
AbstractNodeNameAwareMarshaller imp
clsMap.remove(cls);
}
- CommonUtils.clearClassCache(ldr);
+ ClassLoaderUtils.clearClassCache(ldr);
}
/** {@inheritDoc} */
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
index 1c9836956ad..c514d7293f4 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
@@ -30,7 +30,7 @@ import java.util.List;
import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.marshaller.MarshallerContext;
@@ -301,7 +301,7 @@ class OptimizedMarshallerUtils {
throw new IOException("Failed to resolve class for ID: " + typeId,
e);
}
- Class cls = CommonUtils.forName(clsName, ldr, null,
Marshallers.USE_CACHE.get());
+ Class cls = ClassLoaderUtils.forName(clsName, ldr);
OptimizedClassDescriptor desc = clsMap.get(cls);
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
index 6b6f2a57515..efa48690525 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
@@ -42,12 +42,12 @@ import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.CommonUtils;
import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.io.GridDataInput;
import org.apache.ignite.internal.util.typedef.internal.SB;
import org.apache.ignite.marshaller.MarshallerContext;
-import org.apache.ignite.marshaller.MarshallerUtils;
import org.apache.ignite.marshaller.Marshallers;
import static
org.apache.ignite.internal.marshaller.optimized.OptimizedMarshallerUtils.ARRAY_LIST;
@@ -148,20 +148,18 @@ class OptimizedObjectInputStream extends
ObjectInputStream {
* @param ctx Context.
* @param mapper ID mapper.
* @param clsLdr Class loader.
- * @param useCache True if class loader cache will be used, false
otherwise.
*/
void context(
ConcurrentMap<Class, OptimizedClassDescriptor> clsMap,
MarshallerContext ctx,
OptimizedMarshallerIdMapper mapper,
- ClassLoader clsLdr,
- boolean useCache
+ ClassLoader clsLdr
) {
this.clsMap = clsMap;
this.ctx = ctx;
this.mapper = mapper;
this.clsLdr = clsLdr;
- this.useCache = useCache;
+ this.useCache = Marshallers.USE_CACHE.get();
}
/**
@@ -348,7 +346,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
OptimizedClassDescriptor desc = typeId == 0
? classDescriptor(
clsMap,
- CommonUtils.forName(readUTF(), clsLdr,
MarshallerUtils.classNameFilter(), useCache),
+ ClassLoaderUtils.forName(readUTF(), clsLdr, useCache),
useCache,
ctx,
mapper)
@@ -387,7 +385,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
private Class<?> readClass() throws ClassNotFoundException, IOException {
int compTypeId = readInt();
- return compTypeId == 0 ? CommonUtils.forName(readUTF(), clsLdr, null,
useCache) :
+ return compTypeId == 0 ? ClassLoaderUtils.forName(readUTF(), clsLdr,
useCache) :
classDescriptor(clsMap, compTypeId, clsLdr, useCache, ctx,
mapper).describedClass();
}
@@ -546,7 +544,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
// Must have 'Class.forName()' instead of clsLoader.loadClass()
// due to weird ClassNotFoundExceptions for arrays of classes
// in certain cases.
- return CommonUtils.forName(desc.getName(), clsLdr,
MarshallerUtils.classNameFilter(), Marshallers.USE_CACHE.get());
+ return ClassLoaderUtils.forName(desc.getName(), clsLdr);
}
/**
diff --git
a/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
index f1480fe0a10..6a5c5cb6fbd 100644
---
a/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
+++
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
@@ -21,9 +21,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.MarshallerUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
/**
* This class defines custom JDK object input stream.
@@ -53,7 +51,7 @@ class JdkMarshallerObjectInputStream extends
ObjectInputStream {
// Must have 'Class.forName()' instead of clsLoader.loadClass()
// due to weird ClassNotFoundExceptions for arrays of classes
// in certain cases.
- return CommonUtils.forName(desc.getName(), clsLdr,
MarshallerUtils.classNameFilter(), Marshallers.USE_CACHE.get());
+ return ClassLoaderUtils.forName(desc.getName(), clsLdr);
}
/** {@inheritDoc} */
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
index e2fbee0efe2..a3501b46a07 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
@@ -100,6 +100,7 @@ import org.apache.calcite.sql.validate.SqlNameMatchers;
import org.apache.calcite.util.ImmutableBitSet;
import org.apache.calcite.util.Util;
import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import
org.apache.ignite.internal.processors.query.calcite.prepare.BaseQueryContext;
import
org.apache.ignite.internal.processors.query.calcite.prepare.bounds.ExactBounds;
import
org.apache.ignite.internal.processors.query.calcite.prepare.bounds.MultiBounds;
@@ -115,7 +116,6 @@ import
org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactor
import org.apache.ignite.internal.processors.query.calcite.util.Commons;
import org.apache.ignite.internal.processors.query.calcite.util.RexUtils;
import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
/**
* Utilities for converting {@link RelNode} into JSON format.
@@ -211,7 +211,7 @@ class RelJson {
/** */
private static Class<?> classForName(String typeName, boolean
skipNotFound) {
try {
- return U.forName(typeName, U.gridClassLoader());
+ return ClassLoaderUtils.forName(typeName);
}
catch (ClassNotFoundException e) {
if (!skipNotFound)
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
index ab5ff9f2a86..cb2c770007f 100644
---
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
+++
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
@@ -67,8 +67,6 @@ import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteClientDisconnectedException;
@@ -80,7 +78,6 @@ import
org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
import org.apache.ignite.internal.IgniteFutureCancelledCheckedException;
import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException;
import org.apache.ignite.internal.IgniteInterruptedCheckedException;
-import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
import org.apache.ignite.internal.util.lang.GridClosureException;
import org.apache.ignite.internal.util.lang.GridTuple;
import org.apache.ignite.internal.util.typedef.C1;
@@ -92,7 +89,6 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
import org.apache.ignite.internal.util.worker.GridWorker;
import org.apache.ignite.lang.IgniteFutureCancelledException;
import org.apache.ignite.lang.IgniteFutureTimeoutException;
-import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.thread.IgniteThread;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -250,15 +246,8 @@ public abstract class CommonUtils {
/** Class loader used to load Ignite. */
private static final ClassLoader gridClassLoader =
CommonUtils.class.getClassLoader();
- /** Primitive class map. */
- private static final Map<String, Class<?>> primitiveMap = new
HashMap<>(16, .5f);
-
- /** */
- private static final ConcurrentMap<ClassLoader, ConcurrentMap<String,
Class>> classCache =
- new ConcurrentHashMap<>();
-
/** */
- private static final Class<?> GEOMETRY_CLASS =
classForName("org.locationtech.jts.geom.Geometry", null);
+ private static final Class<?> GEOMETRY_CLASS;
/** Boxed class map. */
private static final Map<Class<?>, Class<?>> boxedClsMap = new
HashMap<>(16, .5f);
@@ -276,15 +265,16 @@ public abstract class CommonUtils {
private static final Set<Class<?>> SQL_TYPES = createSqlTypes();
static {
- primitiveMap.put("byte", byte.class);
- primitiveMap.put("short", short.class);
- primitiveMap.put("int", int.class);
- primitiveMap.put("long", long.class);
- primitiveMap.put("float", float.class);
- primitiveMap.put("double", double.class);
- primitiveMap.put("char", char.class);
- primitiveMap.put("boolean", boolean.class);
- primitiveMap.put("void", void.class);
+ Class<?> geomCls = null;
+
+ try {
+ geomCls = Class.forName("org.locationtech.jts.geom.Geometry");
+ }
+ catch (ClassNotFoundException ignore) {
+ // Ignore.
+ }
+
+ GEOMETRY_CLASS = geomCls;
boxedClsMap.put(byte.class, Byte.class);
boxedClsMap.put(short.class, Short.class);
@@ -793,142 +783,6 @@ public abstract class CommonUtils {
}
}
- /**
- * Gets class for the given name if it can be loaded or default given
class.
- *
- * @param cls Class.
- * @param dflt Default class to return.
- * @return Class or default given class if it can't be found.
- */
- @Nullable public static Class<?> classForName(@Nullable String cls,
@Nullable Class<?> dflt) {
- return classForName(cls, dflt, false);
- }
-
- /**
- * Gets class for the given name if it can be loaded or default given
class.
- *
- * @param cls Class.
- * @param dflt Default class to return.
- * @param includePrimitiveTypes Whether class resolution should include
primitive types
- * (i.e. "int" will resolve to int.class if
flag is set)
- * @return Class or default given class if it can't be found.
- */
- @Nullable public static Class<?> classForName(
- @Nullable String cls,
- @Nullable Class<?> dflt,
- boolean includePrimitiveTypes
- ) {
- Class<?> clazz;
- if (cls == null)
- clazz = dflt;
- else if (!includePrimitiveTypes || cls.length() > 7 || (clazz =
primitiveMap.get(cls)) == null) {
- try {
- clazz = Class.forName(cls);
- }
- catch (ClassNotFoundException ignore) {
- clazz = dflt;
- }
- }
- return clazz;
- }
-
- /**
- * Gets class for provided name. Accepts primitive types names.
- *
- * @param clsName Class name.
- * @param ldr Class loader.
- * @param useCache If true class loader and result should be cached
internally, false otherwise.
- * @return Class.
- * @throws ClassNotFoundException If class not found.
- */
- public static Class<?> forName(
- String clsName,
- @Nullable ClassLoader ldr,
- @Nullable IgnitePredicate<String> clsFilter,
- boolean useCache
- ) throws ClassNotFoundException {
- assert clsName != null;
-
- Class<?> cls = primitiveMap.get(clsName);
-
- if (cls != null)
- return cls;
-
- if (ldr != null) {
- if (!useCache) {
- cls = Class.forName(clsName, true, ldr);
-
- return cls;
- }
- }
- else
- ldr = gridClassLoader;
-
- if (!useCache) {
- cls = Class.forName(clsName, true, ldr);
-
- return cls;
- }
-
- ConcurrentMap<String, Class> ldrMap = classCache.get(ldr);
-
- if (ldrMap == null) {
- ConcurrentMap<String, Class> old = classCache.putIfAbsent(ldr,
ldrMap = new ConcurrentHashMap<>());
-
- if (old != null)
- ldrMap = old;
- }
-
- cls = ldrMap.get(clsName);
-
- if (cls == null) {
- if (clsFilter != null && !clsFilter.apply(clsName))
- throw new ClassNotFoundException("Deserialization of class " +
clsName + " is disallowed.");
-
- // Avoid class caching inside Class.forName
- if (ldr instanceof CacheClassLoaderMarker)
- cls = ldr.loadClass(clsName);
- else
- cls = Class.forName(clsName, true, ldr);
-
- Class old = ldrMap.putIfAbsent(clsName, cls);
-
- if (old != null)
- cls = old;
- }
-
- return cls;
- }
-
- /**
- * Clears class associated with provided class loader from class cache.
- *
- * @param ldr Class loader.
- * @param clsName Class name of clearing class.
- */
- public static void clearClassFromClassCache(ClassLoader ldr, String
clsName) {
- ConcurrentMap<String, Class> map = classCache.get(ldr);
-
- if (map != null)
- map.remove(clsName);
- }
-
- /**
- * Clears class cache for provided loader.
- *
- * @param ldr Class loader.
- */
- public static void clearClassCache(ClassLoader ldr) {
- classCache.remove(ldr);
- }
-
- /**
- * Completely clears class cache.
- */
- public static void clearClassCache() {
- classCache.clear();
- }
-
/**
* Extracts full name of enclosing class from JDK8 lambda class name.
*
@@ -1452,22 +1306,14 @@ public abstract class CommonUtils {
}
/**
- * Returns a first non-null value in a given array, if such is present.
+ * Returns a first non-null value, if such is present.
*
- * @param vals Input array.
- * @return First non-null value, or {@code null}, if array is empty or
contains
- * only nulls.
+ * @param first First value.
+ * @param second Second value.
+ * @return First non-null value, or {@code null}, if both {@code null}.
*/
- @Nullable public static <T> T firstNotNull(@Nullable T... vals) {
- if (vals == null)
- return null;
-
- for (T val : vals) {
- if (val != null)
- return val;
- }
-
- return null;
+ @Nullable public static <T> T firstNotNull(@Nullable T first, @Nullable T
second) {
+ return first != null ? first : second;
}
/**
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
index 532de3ceb41..47f194f3313 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal;
import java.lang.reflect.Constructor;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.compress.CompressionProcessor;
import org.apache.ignite.internal.processors.query.NoOpQueryEngine;
import org.apache.ignite.internal.util.IgniteUtils;
@@ -319,7 +320,7 @@ public enum IgniteComponentType {
@Nullable public MessageFactoryProvider messageFactory() throws
IgniteCheckedException {
Class<?> cls;
- if (msgFactoryCls == null || null == (cls =
U.classForName(msgFactoryCls, null)))
+ if (msgFactoryCls == null || null == (cls =
ClassLoaderUtils.classForName(msgFactoryCls)))
return null;
return (MessageFactoryProvider)U.newInstance(cls);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index db961ddbae9..3ba1de9a2af 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -110,6 +110,7 @@ import
org.apache.ignite.internal.managers.indexing.GridIndexingManager;
import
org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
import org.apache.ignite.internal.managers.systemview.GridSystemViewManager;
import
org.apache.ignite.internal.managers.systemview.IgniteConfigurationIterable;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.plugin.AbstractMessageFactoryProvider;
import org.apache.ignite.internal.plugin.IgniteLogInfoProvider;
import org.apache.ignite.internal.plugin.IgniteLogInfoProviderImpl;
@@ -1853,7 +1854,7 @@ public class IgniteKernal implements IgniteEx,
Externalizable {
notifyLifecycleBeansEx(LifecycleEventType.AFTER_NODE_STOP);
// Clean internal class/classloader caches to avoid stopped
contexts held in memory.
- U.clearClassCache();
+ ClassLoaderUtils.clearClassCache();
MarshallerExclusions.clearCache();
BinaryUtils.clearCache();
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 0adf9f3c4a7..757239daf1f 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -47,6 +47,7 @@ import org.apache.ignite.compute.ComputeLoadBalancer;
import org.apache.ignite.compute.ComputeTaskContinuousMapper;
import org.apache.ignite.compute.ComputeTaskSession;
import org.apache.ignite.internal.executor.GridExecutorService;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
import
org.apache.ignite.internal.processors.cache.persistence.filename.SharedFileTree;
import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
@@ -427,7 +428,7 @@ public class MarshallerContextImpl implements
MarshallerContext {
if (clsName == null)
throw new ClassNotFoundException("Unknown type ID: " + typeId);
- return U.forName(clsName, ldr, MarshallerUtils.classNameFilter());
+ return ClassLoaderUtils.forName(clsName, ldr);
}
/** {@inheritDoc} */
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
index ab4c55c7b52..60a6a4921e6 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
@@ -85,6 +85,7 @@ import org.apache.ignite.internal.binary.BinaryUtils;
import org.apache.ignite.internal.jdbc2.JdbcBlob;
import org.apache.ignite.internal.jdbc2.JdbcClob;
import org.apache.ignite.internal.jdbc2.JdbcUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheUtils;
import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
@@ -2483,7 +2484,7 @@ public class JdbcThinConnection implements Connection {
@Override public Class getClass(int typeId, ClassLoader ldr)
throws ClassNotFoundException, IgniteCheckedException {
- return U.forName(getClassName(MarshallerPlatformIds.JAVA_ID,
typeId), ldr, null);
+ return
ClassLoaderUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId),
ldr);
}
/** {@inheritDoc} */
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
index ca79f5fe927..666ed300a24 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
@@ -37,6 +37,7 @@ import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.compute.ComputeTask;
import org.apache.ignite.configuration.DeploymentMode;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.task.GridInternal;
import org.apache.ignite.internal.util.GridLeanSet;
import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
@@ -453,7 +454,7 @@ public class GridDeployment extends
GridMetadataAwareAdapter implements GridDepl
if (cls == null) {
try {
- cls = U.forName(clsName, clsLdr);
+ cls = ClassLoaderUtils.forName(clsName, clsLdr);
Class<?> cur = clss.putIfAbsent(clsName, cls);
@@ -476,7 +477,7 @@ public class GridDeployment extends
GridMetadataAwareAdapter implements GridDepl
return F.t(cls, null);
else if (!a.equals(clsName)) {
try {
- cls = U.forName(a, clsLdr);
+ cls = ClassLoaderUtils.forName(a, clsLdr);
}
catch (ClassNotFoundException ignored0) {
continue;
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
index d9972a36bd8..f2d2410a9c1 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
@@ -31,6 +31,7 @@ import org.apache.ignite.configuration.DeploymentMode;
import org.apache.ignite.events.DeploymentEvent;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteDeploymentCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.GridAnnotationsCache;
import org.apache.ignite.internal.util.GridClassLoaderCache;
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -194,7 +195,7 @@ class GridDeploymentLocalStore extends
GridDeploymentStoreAdapter {
// Check that class can be loaded.
String clsName = meta.className();
- Class<?> cls = U.forName(clsName != null ? clsName : alias, ldr);
+ Class<?> cls = ClassLoaderUtils.forName(clsName != null ? clsName
: alias, ldr);
if (spi.register(ldr, cls)) {
if (log.isDebugEnabled()) {
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
index 8d1e9dee167..20ac3f01bae 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
@@ -37,6 +37,7 @@ import org.apache.ignite.events.DiscoveryEvent;
import org.apache.ignite.events.Event;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
import org.apache.ignite.internal.util.GridAnnotationsCache;
import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashSet;
@@ -1321,10 +1322,10 @@ public class GridDeploymentPerVersionStore extends
GridDeploymentStoreAdapter {
ClassLoader ldr = classLoader();
// Clear static class cache.
-
U.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
sampleClassName());
+
ClassLoaderUtils.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
sampleClassName());
for (String alias : deployedClassMap().keySet())
-
U.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
alias);
+
ClassLoaderUtils.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
alias);
// Clear optimized marshaller's cache.
ctx.marshaller().onUndeploy(ldr);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
index 492e264272b..3869766ba0a 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
@@ -22,6 +22,7 @@ import java.util.UUID;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.binary.BinaryReaderEx;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import
org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
@@ -106,7 +107,7 @@ public class ClientExecuteTaskRequest extends ClientRequest
{
Class<?> cls;
try {
- cls = U.forName(taskName, U.gridClassLoader());
+ cls = ClassLoaderUtils.forName(taskName);
}
catch (ClassNotFoundException ignored) {
return false;
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
index 18ae92a112c..d9ad3951d57 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
@@ -53,6 +53,7 @@ import org.apache.ignite.internal.binary.BinaryUtils;
import org.apache.ignite.internal.binary.BinaryWriterEx;
import org.apache.ignite.internal.binary.GridBinaryMarshaller;
import org.apache.ignite.internal.binary.streams.BinaryInputStream;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl;
import
org.apache.ignite.internal.processors.cacheobject.PlatformCacheObjectImpl;
@@ -1019,7 +1020,7 @@ public class PlatformUtils {
if (clsName == null)
throw new IgniteException("Java object/factory class name is not
set.");
- Class cls = U.classForName(clsName, null);
+ Class cls = ClassLoaderUtils.classForName(clsName);
if (cls == null)
throw new IgniteException("Java object/factory class is not found
(is it in the classpath?): " +
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 3008503660c..f88deb1c5c4 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -73,6 +73,7 @@ import
org.apache.ignite.internal.cache.query.index.IndexQueryProcessor;
import org.apache.ignite.internal.cache.query.index.IndexQueryResult;
import
org.apache.ignite.internal.cache.query.index.sorted.maintenance.RebuildIndexWorkflowCallback;
import org.apache.ignite.internal.managers.communication.GridMessageListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheObject;
@@ -1475,7 +1476,7 @@ public class GridQueryProcessor extends
GridProcessorAdapter {
if (cacheObjProc instanceof CacheObjectBinaryProcessorImpl) {
CacheObjectBinaryProcessorImpl binProc =
(CacheObjectBinaryProcessorImpl)cacheObjProc;
- Class<?> cls = U.box(U.classForName(clsName, null, true));
+ Class<?> cls =
U.box(ClassLoaderUtils.classForNameWithPrimitives(clsName));
if (cls != null) {
if (!platformOnly)
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 7b917e69a4d..6810b2a731b 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -34,6 +34,7 @@ import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.cache.QueryIndexType;
import org.apache.ignite.configuration.SqlConfiguration;
import org.apache.ignite.internal.binary.BinaryUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -796,7 +797,7 @@ public class QueryTypeDescriptorImpl implements
GridQueryTypeDescriptor {
.allMatch(x -> x == null ||
U.box(expColType.getComponentType()).isAssignableFrom(U.box(x.getClass())));
}
else if (cacheObjects.typeId(expColType.getName()) !=
((BinaryObject)val).type().typeId()) {
- final Class<?> cls =
U.classForName(((BinaryObject)val).type().typeName(), null, true);
+ final Class<?> cls =
ClassLoaderUtils.classForNameWithPrimitives(((BinaryObject)val).type().typeName());
return (cls == null && expColType == Object.class) || (cls != null
&& expColType.isAssignableFrom(cls));
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index 21a16ba4d61..f979957e425 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -44,6 +44,7 @@ import org.apache.ignite.cache.query.QueryCancelledException;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import
org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
@@ -463,8 +464,8 @@ public class QueryUtils {
// We need that to set correct types for _key and _val columns.
// We better box these types - otherwise, if user provides, say, raw
'byte' for
// key or value (which they could), we'll deem key or value as Object
which clearly is not right.
- Class<?> keyCls = U.box(U.classForName(qryEntity.findKeyType(), null,
true));
- Class<?> valCls = U.box(U.classForName(qryEntity.findValueType(),
null, true));
+ Class<?> keyCls =
U.box(ClassLoaderUtils.classForNameWithPrimitives(qryEntity.findKeyType()));
+ Class<?> valCls =
U.box(ClassLoaderUtils.classForNameWithPrimitives(qryEntity.findValueType()));
// If local node has the classes and they are externalizable, we must
use reflection properties.
boolean keyMustDeserialize = mustDeserializeBinary(ctx, keyCls);
@@ -652,7 +653,7 @@ public class QueryUtils {
Object dfltVal = dlftVals != null ? dlftVals.get(fieldName) : null;
QueryBinaryProperty prop = buildBinaryProperty(ctx, fieldName,
- U.classForName(fieldType, Object.class, true),
+
U.firstNotNull(ClassLoaderUtils.classForNameWithPrimitives(fieldType),
Object.class),
d.aliases(), isKeyField, notNull, dfltVal,
precision == null ? -1 : precision.getOrDefault(fieldName, -1),
scale == null ? -1 : scale.getOrDefault(fieldName, -1));
@@ -701,7 +702,7 @@ public class QueryUtils {
QueryBinaryProperty prop = buildBinaryProperty(
ctx,
name,
- U.classForName(typeName, Object.class, true),
+
U.firstNotNull(ClassLoaderUtils.classForNameWithPrimitives(typeName),
Object.class),
d.aliases(),
isKey,
true,
@@ -730,7 +731,7 @@ public class QueryUtils {
d.keyFieldName(),
d.valueFieldName(),
entry.getKey(),
- U.classForName(entry.getValue(), Object.class),
+
U.firstNotNull(ClassLoaderUtils.classForName(entry.getValue()), Object.class),
d.aliases(),
notNulls != null && notNulls.contains(entry.getKey()),
coCtx);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
index 63e86b309c2..89c77ac4fec 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.client.marshaller.GridClientMarshaller;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.rest.GridRestCommand;
import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
import org.apache.ignite.internal.processors.rest.GridRestResponse;
@@ -339,7 +340,7 @@ public class GridTcpRestNioListener extends
GridNioServerListenerAdapter<GridCli
GridClientTaskRequest taskReq = (GridClientTaskRequest)msg;
try {
- return U.hasAnnotation(U.forName(taskReq.taskName(), null),
InterruptibleVisorTask.class);
+ return
U.hasAnnotation(ClassLoaderUtils.forName(taskReq.taskName()),
InterruptibleVisorTask.class);
}
catch (ClassNotFoundException e) {
log.warning("Task closure can't be found: [task=" +
taskReq.taskName() + ']', e);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
index c9d7aa28acc..f5699df4f28 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
@@ -26,8 +26,8 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.binary.BinaryType;
import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
-import org.apache.ignite.internal.util.typedef.internal.U;
import static
org.apache.ignite.internal.processors.security.SecurityUtils.doPrivileged;
import static
org.apache.ignite.internal.processors.security.SecurityUtils.isInIgnitePackage;
@@ -42,7 +42,7 @@ public abstract class IgniteSecurityAdapter extends
GridProcessorAdapter impleme
static {
// ignite-binary-impl. Theoretically, can be absent in runtime due to
other implementation of binary-api.
- Class<?> jdkMarshCls =
U.classForName("org.apache.ignite.marshaller.jdk.JdkMarshallerImpl", null);
+ Class<?> jdkMarshCls =
ClassLoaderUtils.classForName("org.apache.ignite.marshaller.jdk.JdkMarshallerImpl");
if (jdkMarshCls != null)
MODULES.add(jdkMarshCls.getProtectionDomain().getCodeSource());
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
index d7faab230c4..4386f8313e3 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
@@ -65,6 +65,7 @@ import
org.apache.ignite.internal.managers.communication.GridIoManager;
import org.apache.ignite.internal.managers.communication.GridMessageListener;
import org.apache.ignite.internal.managers.deployment.GridDeployment;
import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
import
org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
@@ -1616,7 +1617,7 @@ public class GridTaskProcessor extends
GridProcessorAdapter implements IgniteCha
if (taskName != null) {
try {
- return U.forName(taskName, U.gridClassLoader());
+ return ClassLoaderUtils.forName(taskName);
}
catch (ClassNotFoundException ignored) {
// No-op.
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index d3770f81e54..5b87447a848 100755
---
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -5457,34 +5457,6 @@ public abstract class IgniteUtils extends CommonUtils {
return i <= 0 ? dflt : i;
}
- /**
- * Gets class for provided name. Accepts primitive types names.
- *
- * @param clsName Class name.
- * @param ldr Class loader.
- * @return Class.
- * @throws ClassNotFoundException If class not found.
- */
- public static Class<?> forName(String clsName, @Nullable ClassLoader ldr)
throws ClassNotFoundException {
- return forName(clsName, ldr, null, Marshallers.USE_CACHE.get());
- }
-
- /**
- * Gets class for provided name. Accepts primitive types names.
- *
- * @param clsName Class name.
- * @param ldr Class loader.
- * @return Class.
- * @throws ClassNotFoundException If class not found.
- */
- public static Class<?> forName(
- String clsName,
- @Nullable ClassLoader ldr,
- @Nullable IgnitePredicate<String> clsFilter
- ) throws ClassNotFoundException {
- return forName(clsName, ldr, clsFilter, Marshallers.USE_CACHE.get());
- }
-
/**
* Applies a supplemental hash function to a given hashCode, which
* defends against poor quality hash functions. This is critical
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
index 886afffff12..fb54eea05dc 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
@@ -28,6 +28,7 @@ import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.SystemProperty;
import org.apache.ignite.compute.ComputeTask;
import org.apache.ignite.compute.ComputeTaskName;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.GridAnnotationsCache;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -149,7 +150,7 @@ public class LocalDeploymentSpi extends IgniteSpiAdapter
implements DeploymentSp
assert clsName != null;
try {
- Class<?> cls = U.forName(clsName, clsLdr);
+ Class<?> cls = ClassLoaderUtils.forName(clsName, clsLdr);
assert cls != null;
diff --git
a/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt
b/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt
new file mode 100644
index 00000000000..fcb882c5bce
--- /dev/null
+++ b/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy$NodeTask
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$StartSocketRunnable
diff --git
a/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt
b/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt
new file mode 100644
index 00000000000..bce5a01b445
--- /dev/null
+++ b/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.internal.processors.rest.TcpRestUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.internal.processors.rest.JettyRestProcessorClassFilterTest$Exploit
+org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy$NodeTask
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$StartSocketRunnable
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
index 721dbe731de..8b0b580536b 100644
---
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
@@ -30,6 +30,7 @@ import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.internal.binary.builder.BinaryObjectBuilders;
import
org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes;
import org.apache.ignite.internal.binary.streams.BinaryStreams;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.marshaller.MarshallerContext;
import org.apache.ignite.marshaller.Marshallers;
@@ -139,7 +140,7 @@ public class RawBinaryObjectExtractorTest extends
GridCommonAbstractTest {
/** {@inheritDoc} */
@Override public Class<?> getClass(int typeId, ClassLoader ldr) throws
ClassNotFoundException {
- return U.forName(clsNamesByTypeId.get(typeId), ldr);
+ return ClassLoaderUtils.forName(clsNamesByTypeId.get(typeId), ldr);
}
/** {@inheritDoc} */
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
index e4aa8de4bdc..974efa2ee5f 100644
---
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
@@ -31,6 +31,7 @@ import java.util.Collection;
import java.util.concurrent.Callable;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.compute.ComputeJobAdapter;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.marshaller.GridMarshallerTestInheritedBean;
import org.apache.ignite.marshaller.Marshaller;
@@ -52,7 +53,7 @@ public class OptimizedMarshallerTest extends
GridCommonAbstractTest {
* @return Marshaller.
*/
private OptimizedMarshaller marshaller() {
- U.clearClassCache();
+ ClassLoaderUtils.clearClassCache();
OptimizedMarshaller marsh = Marshallers.optimized();
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
index 67695c9ee51..b34517f6de1 100644
---
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
@@ -1194,7 +1194,7 @@ public class OptimizedObjectStreamSelfTest extends
GridCommonAbstractTest {
in = reg.in();
- in.context(clsMap, CTX, null, getClass().getClassLoader(), true);
+ in.context(clsMap, CTX, null, getClass().getClassLoader());
in.in().bytes(arr, arr.length);
diff --git
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
index 708dac51081..d6bc7cb3d3c 100644
---
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
@@ -33,7 +33,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.managers.communication.GridIoMessage;
import org.apache.ignite.internal.managers.deployment.GridDeploymentRequest;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiPredicate;
import org.apache.ignite.lang.IgniteInClosure;
@@ -165,7 +165,7 @@ public class P2PScanQueryUndeployTest extends
GridCommonAbstractTest {
* @throws Exception if something wrong.
*/
private Set<String> igniteUtilsCachedClasses() throws Exception {
- Field f = CommonUtils.class.getDeclaredField("classCache");
+ Field f = ClassLoaderUtils.class.getDeclaredField("classCache");
f.setAccessible(true);
diff --git
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
index 9bd2d1919a1..4c428f8d05e 100644
---
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.spi.discovery;
import java.util.HashMap;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
import org.apache.ignite.internal.processors.cache.CacheMetricsSnapshot;
import org.apache.ignite.internal.processors.cluster.CacheMetricsMessage;
@@ -81,7 +82,7 @@ public class ClusterMetricsSnapshotSerializeCompatibilityTest
extends GridCommon
* @return Marshaller.
*/
private OptimizedMarshaller marshaller() {
- U.clearClassCache();
+ ClassLoaderUtils.clearClassCache();
OptimizedMarshaller marsh = Marshallers.optimized();
diff --git
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
index d34fd0b4aca..7dcae71df3d 100644
---
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
@@ -53,7 +53,23 @@ import static
org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_WHITELI
*/
public abstract class SocketStreamerUnmarshalVulnerabilityTest extends
GridCommonAbstractTest {
/** */
- public static final String EXPLOIT_CACHE = "exploit-cache";
+ static final String EXPLOIT_CACHE = "exploit-cache";
+
+ /** */
+ static final String EXPLOIT_INCLUDED
+ =
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
+
+ /** */
+ static final String EXPLOIT_WITH_JOBS_INCLUDED
+ =
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_with_jobs_included.txt").getPath();
+
+ /** */
+ static final String EXPLOIT_EXCLUDED_JOBS_INCLUDED
+ =
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt").getPath();
+
+ /** */
+ static final String EXPLOIT_EXCLUDED
+ =
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath();
/** Port. */
private static int port;
@@ -90,8 +106,7 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
- return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST +
- "=" +
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath());
+ return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST + "=" +
EXPLOIT_WITH_JOBS_INCLUDED);
}
}
@@ -105,8 +120,7 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
- return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST +
- "=" +
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath());
+ return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST + "=" +
EXPLOIT_EXCLUDED_JOBS_INCLUDED);
}
}
@@ -120,8 +134,7 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
- return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST +
- "=" +
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath());
+ return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST + "=" +
EXPLOIT_INCLUDED);
}
}
@@ -135,8 +148,7 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
- return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST +
- "=" +
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath());
+ return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST + "=" +
EXPLOIT_EXCLUDED);
}
}
@@ -150,11 +162,9 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
- String path =
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
-
return Arrays.asList(
- "-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + path,
- "-D" + IGNITE_MARSHALLER_WHITELIST + "=" + path
+ "-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + EXPLOIT_INCLUDED,
+ "-D" + IGNITE_MARSHALLER_WHITELIST + "=" +
EXPLOIT_WITH_JOBS_INCLUDED
);
}
}
@@ -189,7 +199,6 @@ public abstract class
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
return true;
}
catch (IOException | IgniteCheckedException e) {
- e.printStackTrace();
return false;
}
diff --git
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index c214494931a..f6e1f1eb677 100755
---
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -85,6 +85,7 @@ import org.apache.ignite.internal.IgnitionEx;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.binary.BinaryUtils;
import org.apache.ignite.internal.managers.systemview.JmxSystemViewExporterSpi;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import
org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree;
@@ -2236,7 +2237,7 @@ public abstract class GridAbstractTest extends
JUnitAssertAware {
// Remove resources cached in static, if any.
GridClassLoaderCache.clear();
- U.clearClassCache();
+ ClassLoaderUtils.clearClassCache();
MarshallerExclusions.clearCache();
BinaryUtils.clearCache();
serializedObj.clear();
diff --git
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
index dbc06337467..3913c1d37d3 100644
---
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
+++
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
@@ -30,6 +30,7 @@ import org.apache.ignite.IgniteLogger;
import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectBuilder;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
import org.apache.ignite.internal.processors.query.GridQueryProperty;
@@ -647,7 +648,7 @@ public final class UpdatePlanBuilder {
final String typeName = key ? desc.keyTypeName() :
desc.valueTypeName();
//Try to find class for the key locally.
- final Class<?> cls = key ?
U.firstNotNull(U.classForName(desc.keyTypeName(), null), desc.keyClass())
+ final Class<?> cls = key ?
U.firstNotNull(ClassLoaderUtils.classForName(desc.keyTypeName()),
desc.keyClass())
: desc.valueClass();
boolean isSqlType = QueryUtils.isSqlType(cls);
diff --git
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
index c91ed3ec587..ad028871809 100644
---
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
+++
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
@@ -48,6 +48,7 @@ import org.apache.ignite.cluster.ClusterState;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.jackson.IgniteBinaryObjectJsonDeserializer;
import org.apache.ignite.internal.jackson.IgniteObjectMapper;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
import org.apache.ignite.internal.processors.rest.GridRestCommand;
import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
@@ -1026,7 +1027,7 @@ public class GridJettyRestHandler extends HttpServlet {
}
// Creating an object of the specified type, if its class is
available.
- Class<?> cls = U.classForName(type, null);
+ Class<?> cls = ClassLoaderUtils.classForName(type);
if (cls != null)
return jsonMapper.readValue(str, cls);
diff --git
a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
index a7d06a8be4d..2db974818cc 100644
---
a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
+++
b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
@@ -69,9 +69,9 @@ import
org.apache.ignite.internal.binary.streams.BinaryInputStream;
import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
import
org.apache.ignite.internal.client.thin.TcpClientTransactions.TcpClientTransaction;
import org.apache.ignite.internal.client.thin.io.ClientConnectionMultiplexer;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
import org.apache.ignite.internal.processors.platform.client.ClientStatus;
import
org.apache.ignite.internal.processors.platform.client.IgniteClientException;
-import org.apache.ignite.internal.util.CommonUtils;
import org.apache.ignite.internal.util.GridArgumentCheck;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.logger.NullLogger;
@@ -860,8 +860,7 @@ public class TcpIgniteClient implements IgniteClient {
@Override public Class getClass(int typeId, ClassLoader ldr)
throws ClassNotFoundException, IgniteCheckedException {
- return
CommonUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), ldr,
null,
- Marshallers.USE_CACHE.get());
+ return
ClassLoaderUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId),
ldr);
}
/** {@inheritDoc} */