RFR (S): 8238676: jni crashes on accessing it from process exit hook

David Holmes david.holmes at oracle.com
Mon Mar 2 22:56:15 UTC 2020


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