[Kaffe] bug found in Kaffe's classloader implementation

Moses DeJong dejong at cs.umn.edu
Wed Mar 17 18:15:13 PST 1999


Hello.

I have run into another problem with kaffe. This example code
shows how the classloader works in the JDK and that Kaffe
just calls exit(). I tried to implement a fix for this problem
in the file kaffe/kaffevm/readClass.c but the code does not
want to compile. Could someone with more knowledge of the kaffe
internals take a look at this problem and my partial fix?



public class ClassDefineBug {

    public static void main(String[] argv) throws Exception {

	MyClassLoader mcl = new MyClassLoader();
	
	String data = "somestring";
	
	Class result = mcl.defineClass(null, data.getBytes());

	System.out.println("result is " + result);
    }
}

class MyClassLoader extends ClassLoader {

Class defineClass(String className, byte[] classData) {
    Class result = null;
    try {
	result = defineClass(null, classData, 0, classData.length);
    } catch (ClassFormatError e) {
	System.out.println("ClassFormatError caught \"" + e.getMessage()
			   + "\"");
    }
    return result;
}


protected Class loadClass(String className,boolean resolveIt)
    throws ClassNotFoundException, SecurityException
{
    return Class.forName(className);
}

}






JDK output

% java ClassDefineBug
ClassFormatError caught "Bad magic number"
result is null



Kaffe output

% kaffe ClassDefineBug
Bad magic 736f6d65 in class





Index: readClass.c
===================================================================
RCS file: /home/cvspublic/kaffe/kaffe/kaffevm/readClass.c,v
retrieving revision 1.5
diff -u -r1.5 readClass.c
--- readClass.c 1999/01/07 21:03:19     1.5
+++ readClass.c 1999/03/18 03:13:31
@@ -19,6 +19,7 @@
 #include "file.h"
 #include "access.h"
 #include "object.h"
+#include "errors.h"
 #include "constants.h"
 #ifdef KAFFEH
 #include <readClassConfig.h>
@@ -41,8 +42,13 @@
        /* Read in class info */
        readu4(&magic, fp);
        if (magic != JAVAMAGIC) {
+               /*
                fprintf(stderr, "Bad magic %x in class\n", magic);
                EXIT(1);
+                */
+                SET_LANG_EXCEPTION_MESSAGE(einfo,
+                       ClassFormatError, "Bad magic number");
+               return (0);
        }
        readu2(&minor_version, fp);
        readu2(&major_version, fp);




thanks

Mo DeJong
dejong at cs.umn.edu



More information about the kaffe mailing list