Skip to content

Commit 7c88a59

Browse files
author
Anton Tarasov
committedOct 26, 2021
8275809: crash in [CommonComponentAccessibility getCAccessible:withEnv:]
Reviewed-by: kizune, pbansal
1 parent c9dec2f commit 7c88a59

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed
 

‎src/java.desktop/macosx/native/libawt_lwawt/awt/a11y/CommonComponentAccessibility.m

+17-15
Original file line numberDiff line numberDiff line change
@@ -419,13 +419,20 @@ + (jobject) getCAccessible:(jobject)jaccessible withEnv:(JNIEnv *)env {
419419
GET_CACCESSIBLE_CLASS_RETURN(NULL);
420420
DECLARE_STATIC_METHOD_RETURN(sjm_getCAccessible, sjc_CAccessible, "getCAccessible",
421421
"(Ljavax/accessibility/Accessible;)Lsun/lwawt/macosx/CAccessible;", NULL);
422-
if ((*env)->IsInstanceOf(env, jaccessible, sjc_CAccessible)) {
423-
return jaccessible;
424-
} else if ((*env)->IsInstanceOf(env, jaccessible, sjc_Accessible)) {
425-
jobject o = (*env)->CallStaticObjectMethod(env, sjc_CAccessible, sjm_getCAccessible, jaccessible);
422+
423+
// jaccessible is a weak ref, check it's still alive
424+
jobject jaccessibleLocal = (*env)->NewLocalRef(env, jaccessible);
425+
if ((*env)->IsSameObject(env, jaccessibleLocal, NULL)) return NULL;
426+
427+
if ((*env)->IsInstanceOf(env, jaccessibleLocal, sjc_CAccessible)) {
428+
return jaccessibleLocal; // delete in the caller
429+
} else if ((*env)->IsInstanceOf(env, jaccessibleLocal, sjc_Accessible)) {
430+
jobject jCAX = (*env)->CallStaticObjectMethod(env, sjc_CAccessible, sjm_getCAccessible, jaccessibleLocal);
426431
CHECK_EXCEPTION();
427-
return o;
432+
(*env)->DeleteLocalRef(env, jaccessibleLocal);
433+
return jCAX; // delete in the caller
428434
}
435+
(*env)->DeleteLocalRef(env, jaccessibleLocal);
429436
return NULL;
430437
}
431438

@@ -535,12 +542,10 @@ + (CommonComponentAccessibility *) createWithParent:(CommonComponentAccessibilit
535542
// try to fetch the jCAX from Java, and return autoreleased
536543
jobject jCAX = [CommonComponentAccessibility getCAccessible:jaccessible withEnv:env];
537544
if (jCAX == NULL) return nil;
538-
if (!wrapped) { // If wrapped is true, then you don't need to get an existing instance, you need to create a new one
539-
CommonComponentAccessibility *value = (CommonComponentAccessibility *) jlong_to_ptr((*env)->GetLongField(env, jCAX, jf_ptr));
540-
if (value != nil) {
541-
(*env)->DeleteLocalRef(env, jCAX);
542-
return [[value retain] autorelease];
543-
}
545+
CommonComponentAccessibility *value = (CommonComponentAccessibility *) jlong_to_ptr((*env)->GetLongField(env, jCAX, jf_ptr));
546+
if (value != nil) {
547+
(*env)->DeleteLocalRef(env, jCAX);
548+
return [[value retain] autorelease];
544549
}
545550

546551
// otherwise, create a new instance
@@ -561,10 +566,7 @@ + (CommonComponentAccessibility *) createWithParent:(CommonComponentAccessibilit
561566
[newChild retain];
562567
(*env)->SetLongField(env, jCAX, jf_ptr, ptr_to_jlong(newChild));
563568

564-
// the link is removed in the wrapper
565-
if (!wrapped) {
566-
(*env)->DeleteLocalRef(env, jCAX);
567-
}
569+
(*env)->DeleteLocalRef(env, jCAX);
568570

569571
// return autoreleased instance
570572
return [newChild autorelease];

0 commit comments

Comments
 (0)