Name: saC57035 Date: 01/16/98
java.lang.ClassLoader.loadClass call of custom created class loader
results in JVM crash on all platforms.
(Core dumped on Solaris, unhandled exception on WinNT etc.)
The bug is introduced in JDK-1.2beta3-C build whereas previous build is okay.
This bug causes the following JCK tests to fail:
JCK-1.0.2b .. JCK-1.2ea2:
api/java_lang/Class/EquivClass.html#Class0603
api/java_lang/Class/EquivClass.html#Class0604
api/java_lang/Class/BoundValue.html#Class1605
JCK-1.2beta2:
api/java_lang/Class/manual.html#GetClassloader
Below is the minimized test demonstrating the bug:
----------- ClassTest.java--------------------
public class ClassTest {
public static void main (String argv[]){
String fname = null;
if (argv.length == 1)
fname = argv[0];
else {
System.out.println("Incorrect number of arguments passed");
System.exit(1);
}
Class c = null;
TestLoader tl = null;
try {
tl = new TestLoader();
} catch(SecurityException s) {
// code checking forSecurityManager removed for clarity
} catch (Throwable e) {
System.out.println("Failed: Unexpected exception thrown: "+e);
}
try {
c = tl.loadClass(fname);
} catch (ClassNotFoundException e) {
System.out.println("Failed: "+e.toString());
}
System.out.println("Passed: class loaded successfully");
}
}
class TestLoader extends ClassLoader {
TestLoader() {
}
protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
try {
return findSystemClass(name);
} catch (Throwable e) {
}
byte data[];
try {
java.io.InputStream in = (new java.net.URL(name)).openStream();
java.io.ByteArrayOutputStream buf=new java.io.ByteArrayOutputStream();
while (true) {
int d=in.read();
if (d==-1) break;
buf.write(d);
}
data=buf.toByteArray();
in.close();
} catch(java.net.MalformedURLException e) {
throw new ClassNotFoundException(e.toString());
} catch(java.io.IOException e) {
throw new RuntimeException(e.toString());
}
Class cl = defineClass(null, data, 0, data.length);
if (resolve)
resolveClass(cl);
return cl;
}
}
class TestClass { int i; }
------ Output of the test under Solaris JDK-1.2beta3-C --------
83% javac ClassTest.java
84% java ClassTest file://`pwd`/TestClass.class
SIGSEGV 11* segmentation violation
si_signo [11]: SIGSEGV 11* segmentation violation
si_errno [0]: Error 0
si_code [1]: SEGV_MAPERR [addr: 0x0]
stackbase=F0000000, stackpointer=EFFFD058
Full thread dump:
"CachedReference sweeper" (TID:0xee300f28, sys_thread_t:0x76e68, state:CW) prio=9
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.Runtime.waitForMemoryAdvice(Runtime.java:569)
at java.lang.ref.CachedReference$Sweeper.run(CachedReference.java:342)
at java.lang.Thread.run(Thread.java:490)
"Finalizer" (TID:0xee300318, sys_thread_t:0x5ce20, state:CW) prio=8
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:86)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:99)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:131)
"Reference handler" (TID:0xee3003c8, sys_thread_t:0x552f0, state:CW) prio=10
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:198)
"Async Garbage Collector" (TID:0xee3001b0, sys_thread_t:0x56678, state:R) prio=1
"Idle thread" (TID:0xee3001f8, sys_thread_t:0x4d8f0, state:R) prio=0
"Clock" (TID:0xee3002d0, sys_thread_t:0x4d7d0, state:CW) prio=12
"main" (TID:0xee300038, sys_thread_t:0x20a08, state:R) prio=5 *current thread*
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:326)
at TestLoader.loadClass(ClassTest.java:57)
at java.lang.ClassLoader.loadClass(ClassLoader.java:172)
at ClassTest.main(ClassTest.java:21)
Monitor Cache Dump:
Registered Monitor Dump:
utf8 hash table: <unowned>
JNI pinning lock: <unowned>
JNI global reference lock: <unowned>
BinClass lock: <unowned>
Class linking lock: <unowned>
System class loader lock: <unowned>
Code rewrite lock: <unowned>
Heap lock: <unowned>
Monitor IO lock: <unowned>
Child death monitor: <unowned>
Event monitor: <unowned>
I/O monitor: <unowned>
Alarm monitor: <unowned>
Waiting to be notified:
"Clock" (0x4d7d0)
Sbrk lock: <unowned>
Monitor cache expansion lock: <unowned>
Thread queue lock: <unowned>
Monitor registry: owner "main" (0x20a08, 1 entry)
Thread Alarm Q:
Abort
======================================================================
- duplicates
-
JDK-4104855 JCK tests using ClassLoader crash JVM
-
- Closed
-