RFR (S): 8238676: jni crashes on accessing it from process exit hook
Anton Tarasov
anton.tarasov at jetbrains.com
Tue Mar 3 06:36:43 UTC 2020
Hi David,
Thanks, please tag it, hope someone else will backport it (or if not I'm
ready to do that job).
With regards,
Anton.
On Tue, Mar 3, 2020 at 1:56 AM David Holmes <david.holmes at oracle.com> wrote:
> Hi Anton,
>
> On 3/03/2020 1:12 am, Anton Tarasov wrote:
> > Hi David,
> >
> > Thank you for fixing this! Is it possible to backport the fix to jdk11?
>
> I can tag it for backporting once it is pushed, but I can't do the
> actual backport for OpenJDK 11u.
>
> David
>
> > Thanks,
> > Anton.
> >
> > On Sat, Feb 29, 2020 at 8:16 AM David Holmes <david.holmes at oracle.com
> > <mailto:david.holmes at oracle.com>> wrote:
> >
> > Hi Gerard,
> >
> > Are you okay with this?
> >
> > Thanks,
> > David
> >
> > On 26/02/2020 10:11 am, David Holmes wrote:
> > > Hi Gerard,
> > >
> > > Thanks for taking a look at this.
> > >
> > > On 26/02/2020 2:45 am, gerard ziemski wrote:
> > >> hi David,
> > >>
> > >> On 2/18/20 8:04 PM, David Holmes wrote:
> > >>> Bug: https://bugs.openjdk.java.net/browse/JDK-8238676
> > >>> webrev: http://cr.openjdk.java.net/~dholmes/8238676/webrev/
> > >>>
> > >>> If an application tries to use JNI from an atexit handler, the
> > >>> attempt can't succeed (the VM has already logically terminated)
> > but
> > >>> it should not crash. The JNI Invocation API code was missing
> some
> > >>> checks in places and wasn't aware of the possibility of trying
> to
> > >>> make calls from the VMThread.
> > >>>
> > >>> Testing:
> > >>> - new test added for the JNI Invocation API
> > >>> - tiers 1-3
> > >>>
> > >>> Thanks,
> > >>> David
> > >>
> > >> In jni_GetEnv() we have:
> > >>
> > >> 4120 if (vm_created == 0) {
> > >> 4121 *penv = NULL;
> > >> 4122 ret = JNI_EDETACHED;
> > >> 4123 return ret;
> > >> 4124 }
> > >>
> > >> but in jni_DetachCurrentThread() we have:
> > >>
> > >> 4063 if (vm_created == 0) {
> > >> 4064 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_ERR);
> > >> 4065 return JNI_ERR;
> > >> 4066 }
> > >>
> > >> should lines 4064,4065 perhaps be:
> > >>
> > >> 4064 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_EDETACHED);
> > >> 4065 return JNI_EDETACHED;
> > >>
> > >> to be consistent?
> > >
> > > Well ... ideally the JNI spec would have considered the question
> of
> > > "what if the JavaVM is no longer live?" and had an JNI_ENOJVM
> errro
> > > code. But it doesn't. Nor does it allow for any JNI method to
> return
> > > JNI_ERR for unexpected errors situations. So we have to adhere to
> > the
> > > specifications for each method.
> > >
> > > For GetEnv the spec only allows for returning JNI_EDETACHED,
> > > JNI_EVERSION or JNI_OK. As you can't be attached to a VM that
> > doesn't
> > > exist then JNI_EDETACHED is the only possible return code - and
> > it isn't
> > > wrong, it just doesn't tell you why you aren't attached.
> > >
> > > If you apply the same logic to DetachCurrentThread, and follow
> > the spec
> > > then it states
> > >
> > > "Trying to detach a thread that is not attached is a no-op."
> > >
> > > which suggests we do nothing and report JNI_OK. But I think that
> > would
> > > be a disservice to the programmer in the case where the JVM is no
> > longer
> > > live. And we're allowed to return "a suitable JNI error code on
> > failure"
> > > so that is what I chose to do. And I return JNI_ERR rather than
> > > JNI_EDETACHED for two reasons:
> > >
> > > 1. It is consistent with what we do for attach in the same
> > circumstance:
> > >
> > > jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void
> > > *_args) {
> > > HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(vm, penv, _args);
> > > if (vm_created == 0) {
> > > HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR);
> > > return JNI_ERR;
> > > }
> > >
> > > 2. It would be confusing to return JNI_EDETACHED as that means
> > "thread
> > > detached from the VM" yet the spec says "Trying to detach a
> > thread that
> > > is not attached is a no-op.". So I need to convey that there is a
> > more
> > > specific underlying error here.
> > >
> > >> Looks good otherwise.
> > >
> > > Thanks for the review.
> > >
> > > David
> > > -----
> > >
> > >>
> > >> cheers
> > >>
> >
>
More information about the hotspot-runtime-dev
mailing list