From 2599b56f41927c9122e457bb811dc89a10164d2b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 13 Mar 2008 16:43:54 +0000 Subject: [PATCH] natClassLoader.cc (_Jv_RegisterInitiatingLoader): Check loading constraints. * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): Check loading constraints. (_Jv_CheckOrCreateLoadingConstraint): New function. * java/lang/ClassLoader.java (loadingConstraints): New field. * link.cc (_Jv_Linker::find_field): Use _Jv_CheckOrCreateLoadingConstraint. (_Jv_Linker::check_loading_constraints): New function. (_Jv_Linker::resolve_method_entry): Use check_loading_constraints. (_Jv_Linker::append_partial_itable): Likewise. (_Jv_Linker::layout_vtable_methods): Likewise. * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. (_Jv_CheckOrCreateLoadingConstraint): Declare. From-SVN: r133172 --- libjava/ChangeLog | 16 +++++ .../lib/java/lang/ClassLoader$AnnotationsKey.class | Bin 1160 -> 1160 bytes libjava/classpath/lib/java/lang/ClassLoader.class | Bin 12507 -> 12663 bytes libjava/include/jvm.h | 6 +- libjava/java/lang/ClassLoader.h | 1 + libjava/java/lang/ClassLoader.java | 12 +++- libjava/java/lang/natClassLoader.cc | 59 ++++++++++++++++- libjava/link.cc | 73 ++++++++++----------- 8 files changed, 123 insertions(+), 44 deletions(-) rewrite libjava/classpath/lib/java/lang/ClassLoader.class (84%) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 84ea6c0b3be..bd92959477b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,19 @@ +2008-03-13 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): + Check loading constraints. + (_Jv_CheckOrCreateLoadingConstraint): New function. + * java/lang/ClassLoader.java (loadingConstraints): New field. + * link.cc (_Jv_Linker::find_field): Use + _Jv_CheckOrCreateLoadingConstraint. + (_Jv_Linker::check_loading_constraints): New function. + (_Jv_Linker::resolve_method_entry): Use + check_loading_constraints. + (_Jv_Linker::append_partial_itable): Likewise. + (_Jv_Linker::layout_vtable_methods): Likewise. + * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. + (_Jv_CheckOrCreateLoadingConstraint): Declare. + 2008-03-10 Jim Meyering Don't leak upon failed realloc. diff --git a/libjava/classpath/lib/java/lang/ClassLoader$AnnotationsKey.class b/libjava/classpath/lib/java/lang/ClassLoader$AnnotationsKey.class index 03de2da433497001e6c4ba1c6614d303d34d6d47..02b44fe24aec5140d6befa45950951e6af53e733 100644 GIT binary patch delta 87 zcwXz^?BLw+jEVI&13SZx$*-Bh6b~@4FdSvzWH`pa$8elMgy95(B*RGt1%^`$sz6$U r;q>Gr<|(4*8CV%EFbFVQWRPaK#GuA-nZbnN!enli0LB}WV_0+mJ|GwY delta 87 zcwXz^?BLw+jEVIk13SaI$*-Bh6t^+3FzjaFWZ1*N$FP?{gkc|pB*T6N1%?9*sz6$U r;o#&X<|(2_8CV&PF$gdmXOLz%!Jx))lEH-G*ko>&0LF8ZV_0+mAY2zs diff --git a/libjava/classpath/lib/java/lang/ClassLoader.class b/libjava/classpath/lib/java/lang/ClassLoader.class dissimilarity index 84% index ef012c299db1e647ee073dfda6ed4a6a1cab071b..694b514cc98be32d6bf989b6d8a22b36bff871cb 100644 GIT binary patch literal 12663 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 loadingConstraints + = new HashMap>(); + + /** * All packages defined by this classloader. It is not private in order to * allow native code (and trusted subclasses) access to this field. */ diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 9a687ff9105..fac1e4dede0 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -1,6 +1,6 @@ // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. -/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation +/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation This file is part of libgcj. @@ -41,6 +41,7 @@ details. */ #include #include #include +#include #include #include #include @@ -143,7 +144,21 @@ _Jv_RegisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) // them later. return; } - loader->loadedClasses->put(klass->name->toString(), klass); + + JvSynchronize sync (loader->loadingConstraints); + + using namespace java::lang::ref; + + jstring name = klass->getName(); + WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); + if (ref) + { + jclass constraint = (jclass) ref->get(); + if (constraint && constraint != klass) + throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); + } + loader->loadingConstraints->put(name, new WeakReference(klass)); + loader->loadedClasses->put(name, klass); } // If we found an error while defining an interpreted class, we must @@ -156,6 +171,46 @@ _Jv_UnregisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) loader->loadedClasses->remove(klass->name->toString()); } +// Check a loading constraint. In particular check that, if there is +// a constraint for the name of KLASS in LOADER, that it maps to +// KLASS. If there is no such constraint, make a new one. If the +// constraint is violated, throw an exception. Do nothing for +// primitive types. +void +_Jv_CheckOrCreateLoadingConstraint (jclass klass, + java::lang::ClassLoader *loader) +{ + // Strip arrays. + while (klass->isArray()) + klass = klass->getComponentType(); + // Ignore primitive types. + if (klass->isPrimitive()) + return; + + if (! loader) + loader = java::lang::VMClassLoader::bootLoader; + jstring name = klass->getName(); + + JvSynchronize sync (loader->loadingConstraints); + + using namespace java::lang::ref; + + WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); + if (ref) + { + jclass constraint = (jclass) ref->get(); + if (constraint) + { + if (klass != constraint) + throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); + // Otherwise, all is ok. + return; + } + } + // No constraint (or old constraint GC'd). Make a new one. + loader->loadingConstraints->put(name, new WeakReference(klass)); +} + // Class registration. // diff --git a/libjava/link.cc b/libjava/link.cc index d6fd2ddafbd..f995531e813 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -246,13 +246,9 @@ _Jv_Linker::find_field (jclass klass, jclass owner, if (_Jv_CheckAccess (klass, *found_class, the_field->flags)) { // Note that the field returned by find_field_helper is always - // resolved. There's no point checking class loaders here, - // since we already did the work to look up all the types. - // FIXME: being lazy here would be nice. - if (the_field->type != field_type) - throw new java::lang::LinkageError - (JvNewStringLatin1 - ("field type mismatch with different loaders")); + // resolved. However, we still use the constraint mechanism + // because this may affect other lookups. + _Jv_CheckOrCreateLoadingConstraint (klass, (*found_class)->loader); } else { @@ -269,6 +265,23 @@ _Jv_Linker::find_field (jclass klass, jclass owner, return the_field; } +// Check loading constraints for method. +void +_Jv_Linker::check_loading_constraints (_Jv_Method *method, jclass self_class, + jclass other_class) +{ + JArray *klass_args; + jclass klass_return; + + _Jv_GetTypesFromSignature (method, self_class, &klass_args, &klass_return); + jclass *klass_arg = elements (klass_args); + java::lang::ClassLoader *found_loader = other_class->loader; + + _Jv_CheckOrCreateLoadingConstraint (klass_return, found_loader); + for (int i = 0; i < klass_args->length; i++) + _Jv_CheckOrCreateLoadingConstraint (*(klass_arg++), found_loader); +} + _Jv_Method * _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, int class_index, int name_and_type_index, @@ -359,39 +372,10 @@ _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, throw new java::lang::NoSuchMethodError (sb->toString()); } - // if (found_class->loader != klass->loader), then we - // must actually check that the types of arguments - // correspond. That is, for each argument type, and - // the return type, doing _Jv_FindClassFromSignature - // with either loader should produce the same result, - // i.e., exactly the same jclass object. JVMS 5.4.3.3 + // if (found_class->loader != klass->loader), then we must actually + // check that the types of arguments correspond. JVMS 5.4.3.3. if (found_class->loader != klass->loader) - { - JArray *found_args, *klass_args; - jclass found_return, klass_return; - - _Jv_GetTypesFromSignature (the_method, - found_class, - &found_args, - &found_return); - _Jv_GetTypesFromSignature (the_method, - klass, - &klass_args, - &klass_return); - - jclass *found_arg = elements (found_args); - jclass *klass_arg = elements (klass_args); - - for (int i = 0; i < found_args->length; i++) - { - if (*(found_arg++) != *(klass_arg++)) - throw new java::lang::LinkageError (JvNewStringLatin1 - ("argument type mismatch with different loaders")); - } - if (found_return != klass_return) - throw new java::lang::LinkageError (JvNewStringLatin1 - ("return type mismatch with different loaders")); - } + check_loading_constraints (the_method, klass, found_class); return the_method; } @@ -925,7 +909,8 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, continue; meth = NULL; - for (jclass cl = klass; cl; cl = cl->getSuperclass()) + jclass cl; + for (cl = klass; cl; cl = cl->getSuperclass()) { meth = _Jv_GetMethodLocal (cl, iface->methods[j].name, iface->methods[j].signature); @@ -947,6 +932,9 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, itable[pos] = (void *) &_Jv_ThrowAbstractMethodError; else itable[pos] = meth->ncode; + + if (cl->loader != iface->loader) + check_loading_constraints (meth, cl, iface); } else { @@ -1501,6 +1489,11 @@ _Jv_Linker::layout_vtable_methods (jclass klass) sb->append(_Jv_GetMethodString(declarer, super_meth)); throw new VerifyError(sb->toString()); } + else if (declarer->loader != klass->loader) + { + // JVMS 5.4.2. + check_loading_constraints (meth, klass, declarer); + } } } -- 2.11.4.GIT