--- a/src/java.base/unix/native/libnet/NetworkInterface.c Fri Jun 15 14:19:51 2018 -0700
+++ b/src/java.base/unix/native/libnet/NetworkInterface.c Wed Jun 20 18:02:22 2018 -0700
@@ -358,7 +358,9 @@
int address1 = htonl(
((struct sockaddr_in *)addrP->addr)->sin_addr.s_addr);
int address2 = getInetAddress_addr(env, iaObj);
- JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ goto cleanup;
+ }
if (address1 == address2) {
match = JNI_TRUE;
break;
@@ -404,6 +406,7 @@
obj = createNetworkInterface(env, curr);
}
+cleanup:
// release the interface list
freeif(ifs);
--- a/src/java.base/windows/native/libnet/NetworkInterface.c Fri Jun 15 14:19:51 2018 -0700
+++ b/src/java.base/windows/native/libnet/NetworkInterface.c Wed Jun 20 18:02:22 2018 -0700
@@ -280,6 +280,7 @@
if (curr->name == NULL || curr->displayName == NULL) {
if (curr->name) free(curr->name);
if (curr->displayName) free(curr->displayName);
+ free(curr);
curr = NULL;
}
}
@@ -586,7 +587,10 @@
/* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr));
- JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrP);
+ return NULL;
+ }
if (addrs->mask != -1) {
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
@@ -600,7 +604,10 @@
return NULL;
}
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr));
- JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrP);
+ return NULL;
+ }
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@@ -611,6 +618,7 @@
if (iaObj) {
jboolean ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) {
+ free_netaddr(netaddrP);
return NULL;
}
--- a/src/java.base/windows/native/libnet/NetworkInterface_winXP.c Fri Jun 15 14:19:51 2018 -0700
+++ b/src/java.base/windows/native/libnet/NetworkInterface_winXP.c Wed Jun 20 18:02:22 2018 -0700
@@ -521,8 +521,9 @@
jobjectArray addrArr, bindsArr, childArr;
netaddr *addrs;
jint addr_index;
- int netaddrCount=ifs->naddrs;
- netaddr *netaddrP=ifs->addrs;
+ int netaddrCount = ifs->naddrs;
+ netaddr *netaddrP = ifs->addrs;
+ netaddr *netaddrPToFree = NULL;
jint bind_index;
/*
@@ -553,21 +554,23 @@
* Note that 0 is a valid number of addresses.
*/
if (netaddrCount < 0) {
- netaddrCount = enumAddresses_win(env, ifs, &netaddrP);
+ netaddrCount = enumAddresses_win(env, ifs, &netaddrPToFree);
if (netaddrCount == -1) {
return NULL;
}
+ netaddrP = netaddrPToFree;
}
addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL);
if (addrArr == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL);
if (bindsArr == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
addrs = netaddrP;
@@ -579,25 +582,32 @@
if (addrs->addr.sa.sa_family == AF_INET) {
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (iaObj == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
/* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr));
- JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrPToFree);
+ return NULL;
+ }
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (ia2Obj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr));
- JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrPToFree);
+ return NULL;
+ }
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@@ -606,10 +616,12 @@
jboolean ret;
iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
if (iaObj == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
scope = addrs->addr.sa6.sin6_scope_id;
@@ -619,8 +631,8 @@
}
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
@@ -633,6 +645,8 @@
(*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
(*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr);
+ free_netaddr(netaddrPToFree);
+
/*
* Windows doesn't have virtual interfaces, so child array
* is always empty.
@@ -672,7 +686,7 @@
}
/* if found create a NetworkInterface */
- if (curr != NULL) {;
+ if (curr != NULL) {
netifObj = createNetworkInterfaceXP(env, curr);
}