Blame SOURCES/jdk8187450-rh1937736-jni_local_refs_networkinterface.patch

438e03
# HG changeset patch
438e03
# User jdowland
438e03
# Date 1616424665 0
438e03
#      Mon Mar 22 14:51:05 2021 +0000
438e03
# Node ID 71c0c9061867c51e4cc59c286eb1a1eae15bc6b5
438e03
# Parent  a4cb0f6662eb43880683e1c859238d0d39f07886
438e03
8187450: JNI local refs exceeds capacity warning in NetworkInterface::getAll
438e03
Reviewed-by: chegar, dfuchs, aph
438e03
438e03
diff --git a/src/java.base/unix/native/libnet/NetworkInterface.c b/src/java.base/unix/native/libnet/NetworkInterface.c
438e03
--- a/src/java.base/unix/native/libnet/NetworkInterface.c
438e03
+++ b/src/java.base/unix/native/libnet/NetworkInterface.c
438e03
@@ -461,6 +461,7 @@
438e03
 
438e03
         // put the NetworkInterface into the array
438e03
         (*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj);
438e03
+        (*env)->DeleteLocalRef(env, netifObj);
438e03
 
438e03
         curr = curr->next;
438e03
     }
438e03
@@ -724,12 +725,14 @@
438e03
                             ((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
438e03
                         JNU_CHECK_EXCEPTION_RETURN(env, NULL);
438e03
                         (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
438e03
+                        (*env)->DeleteLocalRef(env, ia2Obj);
438e03
                     } else {
438e03
                         return NULL;
438e03
                     }
438e03
                 }
438e03
                 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
438e03
                 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
438e03
+                (*env)->DeleteLocalRef(env, ibObj);
438e03
             } else {
438e03
                 return NULL;
438e03
             }
438e03
@@ -758,12 +761,14 @@
438e03
                 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
438e03
                 (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
438e03
                 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
438e03
+                (*env)->DeleteLocalRef(env, ibObj);
438e03
             } else {
438e03
                 return NULL;
438e03
             }
438e03
         }
438e03
 
438e03
         (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj);
438e03
+        (*env)->DeleteLocalRef(env, iaObj);
438e03
         addrP = addrP->next;
438e03
     }
438e03
 
438e03
@@ -796,6 +801,11 @@
438e03
     (*env)->SetObjectField(env, netifObj, ni_bindsID, bindArr);
438e03
     (*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
438e03
 
438e03
+    (*env)->DeleteLocalRef(env, name);
438e03
+    (*env)->DeleteLocalRef(env, addrArr);
438e03
+    (*env)->DeleteLocalRef(env, bindArr);
438e03
+    (*env)->DeleteLocalRef(env, childArr);
438e03
+
438e03
     // return the NetworkInterface
438e03
     return netifObj;
438e03
 }
438e03
diff --git a/src/java.base/windows/native/libnet/NetworkInterface.c b/src/java.base/windows/native/libnet/NetworkInterface.c
438e03
--- a/src/java.base/windows/native/libnet/NetworkInterface.c
438e03
+++ b/src/java.base/windows/native/libnet/NetworkInterface.c
438e03
@@ -609,8 +609,10 @@
438e03
                   return NULL;
438e03
               }
438e03
               (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
438e03
+              (*env)->DeleteLocalRef(env, ia2Obj);
438e03
               (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
438e03
               (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
438e03
+              (*env)->DeleteLocalRef(env, ibObj);
438e03
             }
438e03
         } else /* AF_INET6 */ {
438e03
             int scope;
438e03
@@ -635,9 +637,11 @@
438e03
                 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
438e03
                 (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
438e03
                 (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
438e03
+                (*env)->DeleteLocalRef(env, ibObj);
438e03
             }
438e03
         }
438e03
         (*env)->SetObjectArrayElement(env, addrArr, addr_index, iaObj);
438e03
+        (*env)->DeleteLocalRef(env, iaObj);
438e03
         addrs = addrs->next;
438e03
         addr_index++;
438e03
     }
438e03
@@ -645,6 +649,10 @@
438e03
     (*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr);
438e03
 
438e03
     free_netaddr(netaddrP);
438e03
+    (*env)->DeleteLocalRef(env, name);
438e03
+    (*env)->DeleteLocalRef(env, displayName);
438e03
+    (*env)->DeleteLocalRef(env, addrArr);
438e03
+    (*env)->DeleteLocalRef(env, bindsArr);
438e03
 
438e03
     /*
438e03
      * Windows doesn't have virtual interfaces, so child array
438e03
@@ -655,6 +663,7 @@
438e03
       return NULL;
438e03
     }
438e03
     (*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
438e03
+    (*env)->DeleteLocalRef(env, childArr);
438e03
 
438e03
     /* return the NetworkInterface */
438e03
     return netifObj;
438e03
@@ -875,6 +884,7 @@
438e03
 
438e03
         /* put the NetworkInterface into the array */
438e03
         (*env)->SetObjectArrayElement(env, netIFArr, arr_index++, netifObj);
438e03
+        (*env)->DeleteLocalRef(env, netifObj);
438e03
 
438e03
         curr = curr->next;
438e03
     }
438e03
diff --git a/test/jdk/java/net/NetworkInterface/Test.java b/test/jdk/java/net/NetworkInterface/Test.java
438e03
--- a/test/jdk/java/net/NetworkInterface/Test.java
438e03
+++ b/test/jdk/java/net/NetworkInterface/Test.java
438e03
@@ -23,8 +23,8 @@
438e03
 
438e03
 /* @test
438e03
  * @bug 4405354 6594296 8058216
438e03
- * @run main Test
438e03
- * @run main/othervm -Djava.net.preferIPv4Stack=true Test
438e03
+ * @run main/othervm -Xcheck:jni Test
438e03
+ * @run main/othervm -Xcheck:jni -Djava.net.preferIPv4Stack=true Test
438e03
  * @summary Basic tests for NetworkInterface
438e03
  */
438e03
 import java.net.NetworkInterface;