8204667: Resources not freed on exception
Reviewed-by: skoivu, chegar
This commit is contained in:
parent
e8fc5de2ab
commit
d686431d78
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user