From: Gary Gregory <garydgregory@gmail.com>
Date: Sat, 21 Sep 2024 17:23:08 -0400
Subject: Rewrite ClassUtils.getClass() without recursion to avoid
 StackOverflowError on very long inputs.

- This was found fuzz testing Apache Commons Text which relies on
ClassUtils.
- OssFuzz Issue 42522972:
apache-commons-text:StringSubstitutorInterpolatorFuzzer: Security
exception in org.apache.commons.lang3.ClassUtils.getClass

Reviewed-By: Daniel Leidert <dleidert@debian.org>
Origin: https://github.com/apache/commons-lang/commit/b424803abdb2bec818e4fbcb251ce031c22aca53
Bug: https://github.com/advisories/GHSA-j288-q9x7-2f5v
Bug-Debian: https://bugs.debian.org/1109125
Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2025-48924
Bug-Freexian-Security: https://deb.freexian.com/extended-lts/tracker/CVE-2025-48924
---
 .../java/org/apache/commons/lang3/ClassUtils.java  |  34 ++++++++++-----------
 .../commons/lang3/ClassUtilsOssFuzzTest.java       | Bin 0 -> 17081 bytes
 2 files changed, 16 insertions(+), 18 deletions(-)
 create mode 100644 src/test/java/org/apache/commons/lang3/ClassUtilsOssFuzzTest.java

diff --git a/src/main/java/org/apache/commons/lang3/ClassUtils.java b/src/main/java/org/apache/commons/lang3/ClassUtils.java
index 46c15f1..d41fe15 100644
--- a/src/main/java/org/apache/commons/lang3/ClassUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ClassUtils.java
@@ -527,24 +527,21 @@ public static Class<?> getClass(final ClassLoader classLoader, final String clas
      * @throws ClassNotFoundException if the class is not found
      */
     public static Class<?> getClass(final ClassLoader classLoader, final String className, final boolean initialize) throws ClassNotFoundException {
-        try {
-            final Class<?> clazz = getPrimitiveClass(className);
-            return clazz != null ? clazz : Class.forName(toCanonicalName(className), initialize, classLoader);
-        } catch (final ClassNotFoundException ex) {
-            // allow path separators (.) as inner class name separators
-            final int lastDotIndex = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);
-
-            if (lastDotIndex != -1) {
-                try {
-                    return getClass(classLoader, className.substring(0, lastDotIndex) + INNER_CLASS_SEPARATOR_CHAR + className.substring(lastDotIndex + 1),
-                        initialize);
-                } catch (final ClassNotFoundException ignored) {
-                    // ignore exception
+        // This method was re-written to avoid recursion and stack overflows found by fuzz testing.
+        String next = className;
+        int lastDotIndex = -1;
+        do {
+            try {
+                final Class<?> clazz = getPrimitiveClass(next);
+                return clazz != null ? clazz : Class.forName(toCanonicalName(next), initialize, classLoader);
+            } catch (final ClassNotFoundException ex) {
+                lastDotIndex = next.lastIndexOf(PACKAGE_SEPARATOR_CHAR);
+                if (lastDotIndex != -1) {
+                    next = next.substring(0, lastDotIndex) + INNER_CLASS_SEPARATOR_CHAR + next.substring(lastDotIndex + 1);
                 }
             }
-
-            throw ex;
-        }
+        } while (lastDotIndex != -1);
+        throw new ClassNotFoundException(next);
     }
 
     /**
@@ -1504,9 +1501,10 @@ public static Class<?> primitiveToWrapper(final Class<?> cls) {
     private static String toCanonicalName(final String className) {
         String canonicalName = StringUtils.deleteWhitespace(className);
         Objects.requireNonNull(canonicalName, "className");
-        if (canonicalName.endsWith("[]")) {
+        final String arrayMarker = "[]";
+        if (canonicalName.endsWith(arrayMarker)) {
             final StringBuilder classNameBuffer = new StringBuilder();
-            while (canonicalName.endsWith("[]")) {
+            while (canonicalName.endsWith(arrayMarker)) {
                 canonicalName = canonicalName.substring(0, canonicalName.length() - 2);
                 classNameBuffer.append("[");
             }
diff --git a/src/test/java/org/apache/commons/lang3/ClassUtilsOssFuzzTest.java b/src/test/java/org/apache/commons/lang3/ClassUtilsOssFuzzTest.java
new file mode 100644
index 0000000..3c9d39e
--- /dev/null
+++ b/src/test/java/org/apache/commons/lang3/ClassUtilsOssFuzzTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.commons.lang3;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests {@link ClassUtils}.
+ */
+public class ClassUtilsOssFuzzTest {
+
+    /**
+     * Tests that no StackOverflowError is thrown.
+     * <p>
+     * OSS-Fuzz Issue 42522972: apache-commons-text:StringSubstitutorInterpolatorFuzzer: Security exception in org.apache.commons.lang3.ClassUtils.getClass
+     * </p>
+     */
+    @Test
+    public void testGetClassLongIllegalName() throws Exception {
+        // Input from Commons Text clusterfuzz-testcase-StringSubstitutorInterpolatorFuzzer-5447769450741760
+        assertThrows(ClassNotFoundException.class, () -> ClassUtils.getClass(
+                "ˇda´~e]W]                   ~          t $t ${.u base64encoder{con+s {.u base64encoder{con+s          ~          t   ....................                                                                                      ................ˇˇˇˇˇˇˇˇˇˇ&${localhot:ˇˇˇˇˇˇ4ˇ.........  .........................s${.!. ${..  \\E],${conÅ       EEE]W€EÅE.! ${.u base64encoder{conÅ       EEE]W€EÅE.! ${.u base64encoder{con+s          ~          t   ....................................ˇˇˇˇˇˇˇˇˇˇ&${localhot:ˇˇˇˇˇˇ-636ˇ...............................................................     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - -......     t]V]W€EÅE.! $${.u - - }"));
+    }
+
+    /**
+     * Tests that no StackOverflowError is thrown.
+     */
+    @Test
+    public void testGetClassLongName() throws Exception {
+        // Input from based on the above, without illegal characters.
+        assertThrows(ClassNotFoundException.class, () -> ClassUtils.getClass(StringUtils.repeat("a.", 5_000) + "b"));
+    }
+}
