8204667: Resources not freed on exception

Reviewed-by: skoivu, chegar
This commit is contained in:
Ivan Gerasimov 2018-06-20 18:02:22 -07:00
parent e8fc5de2ab
commit d686431d78
3 changed files with 42 additions and 17 deletions

View File

@ -358,7 +358,9 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
int address1 = htonl( int address1 = htonl(
((struct sockaddr_in *)addrP->addr)->sin_addr.s_addr); ((struct sockaddr_in *)addrP->addr)->sin_addr.s_addr);
int address2 = getInetAddress_addr(env, iaObj); int address2 = getInetAddress_addr(env, iaObj);
JNU_CHECK_EXCEPTION_RETURN(env, NULL); if ((*env)->ExceptionCheck(env)) {
goto cleanup;
}
if (address1 == address2) { if (address1 == address2) {
match = JNI_TRUE; match = JNI_TRUE;
break; break;
@ -404,6 +406,7 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
obj = createNetworkInterface(env, curr); obj = createNetworkInterface(env, curr);
} }
cleanup:
// release the interface list // release the interface list
freeif(ifs); freeif(ifs);

View File

@ -280,6 +280,7 @@ int enumInterfaces(JNIEnv *env, netif **netifPP)
if (curr->name == NULL || curr->displayName == NULL) { if (curr->name == NULL || curr->displayName == NULL) {
if (curr->name) free(curr->name); if (curr->name) free(curr->name);
if (curr->displayName) free(curr->displayName); if (curr->displayName) free(curr->displayName);
free(curr);
curr = NULL; curr = NULL;
} }
} }
@ -586,7 +587,10 @@ jobject createNetworkInterface
/* default ctor will set family to AF_INET */ /* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr)); 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) { if (addrs->mask != -1) {
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) { if (ibObj == NULL) {
@ -600,7 +604,10 @@ jobject createNetworkInterface
return NULL; return NULL;
} }
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr)); 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)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@ -611,6 +618,7 @@ jobject createNetworkInterface
if (iaObj) { if (iaObj) {
jboolean ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr)); jboolean ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) { if (ret == JNI_FALSE) {
free_netaddr(netaddrP);
return NULL; return NULL;
} }

View File

@ -521,8 +521,9 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
jobjectArray addrArr, bindsArr, childArr; jobjectArray addrArr, bindsArr, childArr;
netaddr *addrs; netaddr *addrs;
jint addr_index; jint addr_index;
int netaddrCount=ifs->naddrs; int netaddrCount = ifs->naddrs;
netaddr *netaddrP=ifs->addrs; netaddr *netaddrP = ifs->addrs;
netaddr *netaddrPToFree = NULL;
jint bind_index; jint bind_index;
/* /*
@ -553,21 +554,23 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
* Note that 0 is a valid number of addresses. * Note that 0 is a valid number of addresses.
*/ */
if (netaddrCount < 0) { if (netaddrCount < 0) {
netaddrCount = enumAddresses_win(env, ifs, &netaddrP); netaddrCount = enumAddresses_win(env, ifs, &netaddrPToFree);
if (netaddrCount == -1) { if (netaddrCount == -1) {
return NULL; return NULL;
} }
netaddrP = netaddrPToFree;
} }
addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL); addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL);
if (addrArr == NULL) { if (addrArr == NULL) {
free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL); bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL);
if (bindsArr == NULL) { if (bindsArr == NULL) {
free_netaddr(netaddrP); free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
addrs = netaddrP; addrs = netaddrP;
@ -579,25 +582,32 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
if (addrs->addr.sa.sa_family == AF_INET) { if (addrs->addr.sa.sa_family == AF_INET) {
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID); iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (iaObj == NULL) { if (iaObj == NULL) {
free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
/* default ctor will set family to AF_INET */ /* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr)); 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); ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) { if (ibObj == NULL) {
free_netaddr(netaddrP); free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID); ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (ia2Obj == NULL) { if (ia2Obj == NULL) {
free_netaddr(netaddrP); free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr)); 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)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@ -606,10 +616,12 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
jboolean ret; jboolean ret;
iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID); iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
if (iaObj == NULL) { if (iaObj == NULL) {
free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr)); ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.sa6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) { if (ret == JNI_FALSE) {
free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
scope = addrs->addr.sa6.sin6_scope_id; scope = addrs->addr.sa6.sin6_scope_id;
@ -619,8 +631,8 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
} }
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) { if (ibObj == NULL) {
free_netaddr(netaddrP); free_netaddr(netaddrPToFree);
return NULL; return NULL;
} }
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
@ -633,6 +645,8 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
(*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr); (*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
(*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr); (*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr);
free_netaddr(netaddrPToFree);
/* /*
* Windows doesn't have virtual interfaces, so child array * Windows doesn't have virtual interfaces, so child array
* is always empty. * is always empty.
@ -672,7 +686,7 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0_XP
} }
/* if found create a NetworkInterface */ /* if found create a NetworkInterface */
if (curr != NULL) {; if (curr != NULL) {
netifObj = createNetworkInterfaceXP(env, curr); netifObj = createNetworkInterfaceXP(env, curr);
} }