[kaffe] Should IllegalAccessException be thrown or not?

Ito Kazumitsu kaz at maczuka.gcd.org
Sun Dec 11 23:55:04 PST 2005


From: Ito Kazumitsu <kaz at maczuka.gcd.org>
Date: Mon, 12 Dec 2005 15:21:26 +0900 (JST)

> But I am afraid
> 
>    266          else if( (target->name->data[0] != '[') &&
>    267                   same_package &&
>    268                   (target->this_inner_index >= 0) )
>    269          {
>    270                  slot_acc = 1;
>    271          }
> 
> will make something private in the target class T accessible to
> the caller C if T and C are in the same package and T is a nested
> class.

How about this patch?

--- kaffe/kaffevm/access.c.orig	Fri Aug 19 15:00:41 2005
+++ kaffe/kaffevm/access.c	Mon Dec 12 16:37:15 2005
@@ -153,6 +153,45 @@
 	}
 }
 
+/*
+ * Returns 1 if oc is an outer class of c
+ */
+static
+int outerof (Hjava_lang_Class *c, Hjava_lang_Class *oc)
+{
+	innerClass *ic;
+	Hjava_lang_Class *outer;
+	errorInfo einfo;
+
+	outer = NULL;
+       	if( c->this_inner_index >= 0 )
+	{
+		ic = &c->inner_classes[c->this_inner_index];
+		if( ic->outer_class )
+		{
+			outer = getClass(ic->outer_class, c, &einfo);
+			if( outer == NULL )
+			{
+				discardErrorInfo(&einfo);
+			}
+		}
+	}
+	if ( outer != NULL )
+	{
+		if ( oc == outer)
+		{
+			return 1;
+		}
+		else
+		{
+			return outerof(outer, oc);
+		}
+	}
+	else {
+		return 0;
+	}
+}
+
 int checkAccess(struct Hjava_lang_Class *context,
 		struct Hjava_lang_Class *target,
 		accessFlags target_flags)
@@ -236,6 +275,14 @@
 		}
 
 	}
+	else if ( outerof(target, context) )
+	{
+		/* target is within the context. */
+		class_acc = 1;
+		slot_acc = 1;
+
+		return 1;
+	}
 	
 	if((context->packageLength == target->packageLength) &&
 	    !strncmp(context->name->data,
@@ -263,12 +310,17 @@
 		/* Package. */
 		slot_acc = 1;
 	}
+/*
+	Commented out because private members get accessible to
+	any context in the same package if target is a nested class.
+
 	else if( (target->name->data[0] != '[') &&
 		 same_package &&
 		 (target->this_inner_index >= 0) )
 	{
  		slot_acc = 1;
 	}
+*/
 	else if( context->this_inner_index >= 0 )
 	{
 		innerClass *ic;



More information about the kaffe mailing list