Skip to content

Commit 51ed068

Browse files
committed
move to RT.classForName in import
don't gen stubs for package-private methods in gen-class and proxy (causes security violation in applets) Made root classloader create-on-demand, so no DynamicClassLoader unless dynamic code (eval/load, non-AOT proxy) AOT compiled applets should work
1 parent f8eea33 commit 51ed068

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

src/clj/clojure/core.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,11 +1678,11 @@
16781678
(let [n (name spec)
16791679
dot (.lastIndexOf n (. clojure.lang.RT (intCast \.)))
16801680
c (symbol (.substring n (inc dot)))]
1681-
(. ns (importClass c (. Class (forName (name spec))))))
1681+
(. ns (importClass c (. clojure.lang.RT (classForName (name spec))))))
16821682
(let [pkg (first spec)
16831683
classes (rest spec)]
16841684
(doseq [c classes]
1685-
(. ns (importClass c (. Class (forName (str pkg "." c)))))))))))
1685+
(. ns (importClass c (. clojure.lang.RT (classForName (str pkg "." c)))))))))))
16861686

16871687

16881688
(defn into-array

src/clj/clojure/core_proxy.clj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@
158158
mods (. meth (getModifiers))
159159
mk (method-sig meth)]
160160
(if (or (considered mk)
161-
(. Modifier (isPrivate mods))
161+
(not (or (Modifier/isPublic mods) (Modifier/isProtected mods)))
162+
;(. Modifier (isPrivate mods))
162163
(. Modifier (isStatic mods))
163164
(. Modifier (isFinal mods))
164165
(= "finalize" (.getName meth)))
@@ -209,7 +210,7 @@
209210
pname (proxy-name super interfaces)]
210211
(or (RT/loadClassForName pname)
211212
(let [[cname bytecode] (generate-proxy super interfaces)]
212-
(. RT/ROOT_CLASSLOADER (defineClass pname bytecode))))))
213+
(. (RT/getRootClassLoader) (defineClass pname bytecode))))))
213214

214215
(defn construct-proxy
215216
"Takes a proxy class and any arguments for its superclass ctor and

src/clj/clojure/genclass.clj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
mods (. meth (getModifiers))
3333
mk (method-sig meth)]
3434
(if (or (considered mk)
35-
(. Modifier (isPrivate mods))
35+
(not (or (Modifier/isPublic mods) (Modifier/isProtected mods)))
36+
;(. Modifier (isPrivate mods))
3637
(. Modifier (isStatic mods))
3738
(. Modifier (isFinal mods))
3839
(= "finalize" (.getName meth)))
@@ -635,6 +636,6 @@
635636
[& options]
636637
(let [options-map (apply hash-map options)
637638
[cname bytecode] (generate-class options-map)]
638-
(.. clojure.lang.RT ROOT_CLASSLOADER (defineClass cname bytecode))))
639+
(.. (clojure.lang.RT/getRootClassLoader) (defineClass cname bytecode))))
639640

640641
)

src/jvm/clojure/lang/RT.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
import java.util.concurrent.atomic.AtomicInteger;
1616
import java.util.concurrent.Callable;
1717
import java.util.*;
18-
import java.util.zip.ZipEntry;
19-
import java.util.jar.JarFile;
20-
import java.util.jar.JarEntry;
2118
import java.util.regex.Matcher;
2219
import java.io.*;
2320
import java.lang.reflect.Array;
@@ -26,7 +23,6 @@
2623
import java.security.AccessController;
2724
import java.security.PrivilegedAction;
2825
import java.net.URL;
29-
import java.net.URLConnection;
3026
import java.net.JarURLConnection;
3127
import java.nio.charset.Charset;
3228

@@ -240,11 +236,11 @@ public int compare(Object o1, Object o2){
240236
};
241237

242238
static AtomicInteger id = new AtomicInteger(1);
243-
static final public DynamicClassLoader ROOT_CLASSLOADER = new DynamicClassLoader();
239+
private static DynamicClassLoader ROOT_CLASSLOADER = null;
244240

245241
static public void addURL(Object url) throws Exception{
246242
URL u = (url instanceof String) ? (new URL((String) url)) : (URL) url;
247-
ROOT_CLASSLOADER.addURL(u);
243+
getRootClassLoader().addURL(u);
248244
}
249245

250246
static
@@ -1492,6 +1488,7 @@ static public Object[] setValues(Object... vals){
14921488
static public ClassLoader makeClassLoader(){
14931489
return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction(){
14941490
public Object run(){
1491+
getRootClassLoader();
14951492
return new DynamicClassLoader(baseLoader());
14961493
}
14971494
});
@@ -1500,12 +1497,14 @@ public Object run(){
15001497
static public ClassLoader baseLoader(){
15011498
if(booleanCast(USE_CONTEXT_CLASSLOADER.get()))
15021499
return Thread.currentThread().getContextClassLoader();
1503-
return ROOT_CLASSLOADER;
1500+
else if(ROOT_CLASSLOADER != null)
1501+
return ROOT_CLASSLOADER;
1502+
return Compiler.class.getClassLoader();
15041503
}
15051504

15061505
static public Class classForName(String name) throws ClassNotFoundException{
15071506

1508-
return Class.forName(name, false, baseLoader());
1507+
return Class.forName(name, true, baseLoader());
15091508
}
15101509

15111510
static public Class loadClassForName(String name) throws ClassNotFoundException{
@@ -1702,4 +1701,10 @@ public Object next() throws Exception {
17021701
return eos();
17031702
}
17041703
};
1704+
1705+
synchronized public static DynamicClassLoader getRootClassLoader() {
1706+
if(ROOT_CLASSLOADER == null)
1707+
ROOT_CLASSLOADER = new DynamicClassLoader();
1708+
return ROOT_CLASSLOADER;
1709+
}
17051710
}

0 commit comments

Comments
 (0)