Skip to content

Commit ba504fc

Browse files
Jonathan DowlandChrisHegarty
Jonathan Dowland
authored andcommittedMar 22, 2021
8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll
Reviewed-by: chegar, dfuchs, aph
1 parent 0abbfb2 commit ba504fc

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed
 

‎src/java.base/unix/native/libnet/NetworkInterface.c

+10
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll
503503

504504
// put the NetworkInterface into the array
505505
(*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj);
506+
(*env)->DeleteLocalRef(env, netifObj);
506507

507508
curr = curr->next;
508509
}
@@ -766,12 +767,14 @@ static jobject createNetworkInterface(JNIEnv *env, netif *ifs) {
766767
((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
767768
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
768769
(*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
770+
(*env)->DeleteLocalRef(env, ia2Obj);
769771
} else {
770772
return NULL;
771773
}
772774
}
773775
(*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
774776
(*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
777+
(*env)->DeleteLocalRef(env, ibObj);
775778
} else {
776779
return NULL;
777780
}
@@ -800,12 +803,14 @@ static jobject createNetworkInterface(JNIEnv *env, netif *ifs) {
800803
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
801804
(*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
802805
(*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
806+
(*env)->DeleteLocalRef(env, ibObj);
803807
} else {
804808
return NULL;
805809
}
806810
}
807811

808812
(*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj);
813+
(*env)->DeleteLocalRef(env, iaObj);
809814
addrP = addrP->next;
810815
}
811816

@@ -838,6 +843,11 @@ static jobject createNetworkInterface(JNIEnv *env, netif *ifs) {
838843
(*env)->SetObjectField(env, netifObj, ni_bindsID, bindArr);
839844
(*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
840845

846+
(*env)->DeleteLocalRef(env, name);
847+
(*env)->DeleteLocalRef(env, addrArr);
848+
(*env)->DeleteLocalRef(env, bindArr);
849+
(*env)->DeleteLocalRef(env, childArr);
850+
841851
// return the NetworkInterface
842852
return netifObj;
843853
}

‎src/java.base/windows/native/libnet/NetworkInterface.c

+10
Original file line numberDiff line numberDiff line change
@@ -641,8 +641,10 @@ jobject createNetworkInterface
641641
return NULL;
642642
}
643643
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
644+
(*env)->DeleteLocalRef(env, ia2Obj);
644645
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
645646
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
647+
(*env)->DeleteLocalRef(env, ibObj);
646648
}
647649
} else /* AF_INET6 */ {
648650
int scope;
@@ -667,16 +669,22 @@ jobject createNetworkInterface
667669
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
668670
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
669671
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
672+
(*env)->DeleteLocalRef(env, ibObj);
670673
}
671674
}
672675
(*env)->SetObjectArrayElement(env, addrArr, addr_index, iaObj);
676+
(*env)->DeleteLocalRef(env, iaObj);
673677
addrs = addrs->next;
674678
addr_index++;
675679
}
676680
(*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
677681
(*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr);
678682

679683
free_netaddr(netaddrP);
684+
(*env)->DeleteLocalRef(env, name);
685+
(*env)->DeleteLocalRef(env, displayName);
686+
(*env)->DeleteLocalRef(env, addrArr);
687+
(*env)->DeleteLocalRef(env, bindsArr);
680688

681689
/*
682690
* Windows doesn't have virtual interfaces, so child array
@@ -687,6 +695,7 @@ jobject createNetworkInterface
687695
return NULL;
688696
}
689697
(*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
698+
(*env)->DeleteLocalRef(env, childArr);
690699

691700
/* return the NetworkInterface */
692701
return netifObj;
@@ -959,6 +968,7 @@ JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll
959968

960969
/* put the NetworkInterface into the array */
961970
(*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj);
971+
(*env)->DeleteLocalRef(env, netifObj);
962972

963973
curr = curr->next;
964974
}

‎test/jdk/java/net/NetworkInterface/Test.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
/* @test
2525
* @bug 4405354 6594296 8058216
2626
* @library /test/lib
27-
* @run main Test
28-
* @run main/othervm -Djava.net.preferIPv4Stack=true Test
27+
* @run main/othervm -Xcheck:jni Test
28+
* @run main/othervm -Xcheck:jni -Djava.net.preferIPv4Stack=true Test
2929
* @summary Basic tests for NetworkInterface
3030
*/
3131
import java.net.NetworkInterface;

0 commit comments

Comments
 (0)
Please sign in to comment.