Hi Seán, On 01/12/14 18:48, Seán Coffey wrote:
Looks fine to me Daniel. Thanks for handling it. I can work on the 7u backport if necessary.
Thanks :-)
on the test side would it be worth testing all public classes available (e.g in rt.jar ?) to ensure that Field.setAccessible works as expected and that we don't hit this issue again ? It might be some what of a heavy test for jtreg inclusion though.
It could be worth a try. But let's wait until JEP 220 is in. best regards, -- daniel
regards, Sean. On 01/12/14 16:29, Daniel Fuchs wrote:Hi, Please find below a patch for: 8065552: setAccessible(true) on fields of Class may throw a SecurityException webrev: http://cr.openjdk.java.net/~dfuchs/webrev_8065552/webrev.00/ Description of the problem: The following test case passes on 8u20 but fails on 8u40 and above: public class Test { public static void main(String[] args) throws Throwable { for (Field f : Class.class.getDeclaredFields()) { f.setAccessible(true); } } } The fix for JDK-6642881 introduced a new private field to Class, named "classloader", whose accessibility can never be modified (from the default of non-accessible to accessible). This issue manifests itself in Jython where, when the Options.respectJavaAccessibility is false (by default it is true), a SecurityException occurs when it tries to setAccessible(true) all declared fields on Class: https://hg.python.org/jython/file/tip/src/org/python/core/PyJavaType.java#l405 The SecurityException is lost in the noise of other exceptions as the error propagates through the runtime. The observable symptom is a NullPointerException which occurs when one tries to load the Jython engine. With 8u40 it fails with exception: java.lang.NullPointerException at org.python.core.Py.recursiveIsInstance(Py.java:1861) at org.python.core.Py.isInstance(Py.java:1828) at org.python.core.__builtin__.isinstance(__builtin__.java:725) at org.python.core.Py.displayException(Py.java:1009) at org.python.core.PyException.printStackTrace(PyException.java:79) at org.python.core.PyException.toString(PyException.java:98) at org.apache.commons.logging.impl.SimpleLog.log(SimpleLog.java:329) at org.apache.commons.logging.impl.SimpleLog.error(SimpleLog.java:525) at org.apache.bsf.BSFManager.loadScriptingEngine(BSFManager.java:717) ... The fix is to hide the field from reflection instead of simply preventing it to be set as accessible. best regards, -- daniel
