Andrew Haley writes:
 > Andrew Haley writes:
 >  > Robert Lougher writes:
 >  > 
 >  >  > Had a quick look, and in Classpath-0.93 java.util.AbstractMap contains
 >  >  > a class BasicMapEntry which implements getValue().  BasicMapEntry is
 >  >  > package-private.  This isn't accessible outside the package.
 >  >  > 
 >  >  > In CVS HEAD, this has changed and java.util.AbstractMap contains a
 >  >  > class SimpleEntry which implements getValue().  SimpleEntry is public.
 >  >  >  Obviously, this is accessible...
 >  > 
 >  > OK, thanks.  I'm working on a gcj patch now.
 > 
 > Done.

Eww, this doesn't work for private inner classes.  We must allow
access to private classes but not package-private classes in other
packages.

Here's something better.

Andrew.


2007-04-11  Andrew Haley  <[EMAIL PROTECTED]>

        * java/lang/reflect/natMethod.cc (Method::invoke): In invoke also
        check that the method's declaring class is accessible.

Index: natMethod.cc
===================================================================
*** natMethod.cc        (revision 123473)
--- natMethod.cc        (working copy)
***************
*** 173,184 ****
      }
  
    // Check accessibility, if required.
!   if (! (Modifier::isPublic (meth->accflags) || this->isAccessible()))
      {
        Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$);
        if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags))
        throw new IllegalAccessException;
      }
  
    if (declaringClass->isInterface())
      iface = declaringClass;
--- 173,202 ----
      }
  
    // Check accessibility, if required.
!   if (! this->isAccessible())
!     {
!       if (! (Modifier::isPublic (meth->accflags)))
        {
          Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$);
          if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags))
            throw new IllegalAccessException;
        }
+       else
+       // Method is public, check to see if class is accessible.
+       {
+         jint flags = (declaringClass->accflags
+                       & (Modifier::PUBLIC
+                          | Modifier::PROTECTED
+                          | Modifier::PRIVATE));
+         if (flags == 0) // i.e. class is package private
+           {
+             Class *caller = _Jv_StackTrace::GetCallingClass (&Method::class$);
+             if (! _Jv_ClassNameSamePackage (caller->name,
+                                             declaringClass->name))
+               throw new IllegalAccessException;
+           }
+       }
+     }
  
    if (declaringClass->isInterface())
      iface = declaringClass;

Reply via email to