Skip to content

Commit 73ca7a1

Browse files
committed
LDEV-5305 - resolve race condition in loadClass() and standardize synchronization
Move findLoadedClass() inside sync block and use getClassLoadingLock() consistently to prevent TOCTOU race condition in class loading.
1 parent 2ded6bd commit 73ca7a1

File tree

4 files changed

+8
-10
lines changed

4 files changed

+8
-10
lines changed

core/src/main/java/lucee/commons/lang/PhysicalClassLoader.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public static PhysicalClassLoader getPhysicalClassLoader(Config c, Resource dire
133133
public static PhysicalClassLoader getRPCClassLoader(Config c, JavaSettings js, boolean reload, ClassLoader parent) throws IOException {
134134
String key = js == null ? "orphan" : ((JavaSettingsImpl) js).id();
135135
if (parent != null) {
136-
if (parent instanceof PhysicalClassLoader) key += "_" + ((PhysicalClassLoader) parent).id;
136+
if (parent instanceof PhysicalClassLoader) key += "_" + ((PhysicalClassLoader) parent).id;
137137
else key += "_" + parent.hashCode();
138138
}
139139
PhysicalClassLoader rpccl = reload ? null : classLoaders.get(key);
@@ -248,7 +248,7 @@ private Class<?> loadClass(String name, boolean resolve, boolean loadFromFS, Cla
248248
Class<?> c = findLoadedClass(name);
249249

250250
if (c == null) {
251-
synchronized (SystemUtil.createToken("PhysicalClassLoader:load", name)) {
251+
synchronized (getClassLoadingLock(name)) {
252252
c = findLoadedClass(name);
253253
if (c == null) {
254254
ClassLoader pcl = getParent();
@@ -299,10 +299,8 @@ private Class<?> loadClass(String name, boolean resolve, boolean loadFromFS) thr
299299

300300
@Override
301301
public Class<?> loadClass(String name, byte[] barr) throws UnmodifiableClassException {
302-
// Class<?> clazz = null;
303-
Class<?> clazz = findLoadedClass(name);
304-
305-
synchronized (SystemUtil.createToken("PhysicalClassLoader:load", name)) {
302+
synchronized (getClassLoadingLock(name)) {
303+
Class<?> clazz = findLoadedClass(name);
306304
if (clazz == null) return _loadClass(name, barr, false);
307305
return rename(clazz, barr);
308306
}
@@ -331,7 +329,7 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
331329
}
332330
}
333331

334-
synchronized (SystemUtil.createToken("PhysicalClassLoader:load", name)) {
332+
synchronized (getClassLoadingLock(name)) {
335333
Resource res = directory.getRealResource(name.replace('.', '/').concat(".class"));
336334
if (!res.isFile()) {
337335
// if (cnfe != null) throw cnfe;

loader/build.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<project default="core" basedir="." name="Lucee"
33
xmlns:resolver="antlib:org.apache.maven.resolver.ant">
44

5-
<property name="version" value="6.2.3.34-SNAPSHOT"/>
5+
<property name="version" value="6.2.3.35-SNAPSHOT"/>
66

77
<taskdef uri="antlib:org.apache.maven.resolver.ant" resource="org/apache/maven/resolver/ant/antlib.xml">
88
<classpath>

loader/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>org.lucee</groupId>
55
<artifactId>lucee</artifactId>
6-
<version>6.2.3.34-SNAPSHOT</version>
6+
<version>6.2.3.35-SNAPSHOT</version>
77
<packaging>jar</packaging>
88

99
<name>Lucee Loader Build</name>

test/tickets/LDEV5305.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
component extends="org.lucee.cfml.test.LuceeTestCase" displayname="LDEV5305" skip=true {
1+
component extends="org.lucee.cfml.test.LuceeTestCase" displayname="LDEV5305" {
22

33
function beforeAll(){
44
variables.randomTestFiles = [];

0 commit comments

Comments
 (0)