Re: problem with class accessiblity check in invoke (natMethod.cc)

Bryce McKinlay <[email protected]>
Newsgroups gmane.comp.gcc.java.devel
Message-ID <[email protected]>
On Wed, Dec 23, 2009 at 3:58 PM, Erik J Groeneveld <[email protected]> wrote:

> You refer to this I assume:
> "A member (class, interface, field, or method) of a reference (class,
> interface, or array) type or a constructor of a class type is accessible
> only if the type is accessible and the member or constructor is declared to
> permit access:
>
> If the member or constructor is declared public, then access is permitted.
> All members of interfaces are implicitly public.
> Otherwise, if the member or constructor is declared protected, then access
> is permitted only when one of the following is true:
>
> Access to the member or constructor occurs from within the package
> containing the class in which the protected member or constructor is
> declared.
> Access is correct as described in §6.6.2.
>
> Otherwise, if the member or constructor is declared private, then access is
> permitted if and only if it occurs within the body of the top level
> class (§7.6) that encloses the declaration of the member or constructor.
> Otherwise, we say there is default access, which is permitted only when the
> access occurs from within the package in which the type is declared.
>
> "
> It seems that the type is accessible (Iterator) and the method is declared
> public. Then it is accessible without further conditions.
> The patch in invoke falls back to the scenario under the last bullet, which
> is not correct I believe.

In your example, you aren't testing the accessibility of Iterator, but
rather that of the class which is returned by ArrayList.iterator(),
which is indeed a package-private class from a different package!

Another fix for your code would be to change:

   java::lang::reflect::Method* m = i->getClass()->getDeclaredMethod(
           JvNewStringUTF("hasNext"), NULL);

to something like:

   java::lang::reflect::Method* m =
&(java::util::Iterator::class$)->getDeclaredMethod(
              JvNewStringUTF("hasNext"), NULL);

Bryce
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.