On 08/16/2014 12:39 AM, John Rose wrote:
On Aug 15, 2014, at 5:03 AM, Florian Weimer <fwei...@redhat.com> wrote:

On 08/14/2014 10:15 PM, Mark Roos wrote:
Look into sun.Misc.Unsafe
[and at defineAnonymousClass(Class, byte[], Object[])]

Thanks.  Could we turn this into a supported API, with a suitable security 
manager check?
Hi Florian and Mark.

Here's the story about that.

Unsafe.defineAnonymousClass is used inside the JDK for loading small classes of 
indeterminate lifetime.  Many of them contain single static methods, which 
makes it, in effect, an anonymous method loader.

Because the small bits of code often need to be injected into a pre-existing class, a 
"host class" can be designated, which means the anonymous class has access to 
everything the host class can access, including host class privates.

Because the small bits of dynamically generated code can depend on (meta-)data values that are 
dynamically computed and/or are anonymous, the class's constant pool can be "patched" to 
refer to "live" values that do not have symbolic names.

So it allows some low-level tinkering with the JVM internals.  Like any 
non-standard internal API, if you use it, you are tightly coupled to the JVM 
implementation, and you are on your own if something goes wrong.  We fix bugs 
in this internal feature only if it fixes a bug in a standard J2SE feature that 
somehow depends on it.

I expect that defineAC and its use cases will help inform future consideration of 
next-generation class loading APIs.  I don't expect it to become a standard feature on 
its own.  For one thing, the design is "not quite right":  It should really be 
a method loader, but we don't have a separate format for methods.  The constant pool 
patching part of the API, while necessary, requires knowledge of constant pool layout, 
which feels wrong too.

Specifically, in the context of a (not yet existing) "classfile 2.0" effort, 
defineAC should help us think about the format of a stand-alone method, about the 
interaction of packaging and access rights, and about the division of labor between 
constant pool and bytecode.  Since these are (to my mind) open-ended design questions, I 
don't think we will promote the existing ad hoc API to a public one, unless there is a 
compelling short term reason to do so.

The most obvious security interaction is with the host-class feature; as it 
stands the API is very unsafe because you could use it to inject code into any 
system class.

Just allowing the existing API with a security manager check is too 
coarse-grained to make the feature useful, except to highly trusted code.

If the host-class token were changed to a MethodHandles.Lookup object, we could 
restrict the host-class to be one which the user already had appropriate access 
to.  Seems simple, but of course the rest of the project is complicated:   API 
design, spec completion, security analysis, positive and negative test 
creation, code development, quality assurance—all these would be expensive, and 
(again) most easily justified in the context of a larger refresh of our 
classfile format.

Do you have a use case in mind that could be expressed as a more tightly 
focused API?  It might be easier to standardize on a very specific API that 
used dAC.

Or, most or all of dAC could be simulated using regular class loading, into a 
single-use ClassLoader object.  The nominal bytecodes would have to be 
rewritten to use invokedynamic to manage the linking, at least to host-class 
names.  But given that ASM is inside the JDK, the tools are all available.  
(Remi could do most of it in an afternoon. :-) )  Given such a simulation, the 
internal dAC mechanism could be used as an optimization, when available, but 
there would be a standard (complex) semantics derived from ordinary classes and 
indy.

https://gist.github.com/forax/0c25deac1867d1ef3247


— John

Rémi


I'm surprised there aren't any callers of this method in Fedora. Anonymous 
classes look very useful for run-time code generation.

--
Florian Weimer / Red Hat Product Security
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to