src/windows/native/java/net/NetworkInterface_winXP.c
Print this page
*** 71,104 ****
static int bufsize = 1024;
/*
* return an array of IP_ADAPTER_ADDRESSES containing one element
! * for each apdapter on the system. Returned in *adapters.
* Buffer is malloc'd and must be freed (unless error returned)
*/
static int getAdapters (JNIEnv *env, IP_ADAPTER_ADDRESSES **adapters) {
DWORD ret, flags;
IP_ADAPTER_ADDRESSES *adapterInfo;
ULONG len;
adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
! if (adapterInfo == 0) {
return -1;
}
len = bufsize;
flags = GAA_FLAG_SKIP_DNS_SERVER;
flags |= GAA_FLAG_SKIP_MULTICAST;
flags |= GAA_FLAG_INCLUDE_PREFIX;
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
if (ret == ERROR_BUFFER_OVERFLOW) {
! adapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
! if (adapterInfo == 0) {
return -1;
}
bufsize = len;
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
}
if (ret != ERROR_SUCCESS) {
free (adapterInfo);
JNU_ThrowByName(env, "java/lang/Error",
"IP Helper Library GetAdaptersAddresses function failed");
return -1;
--- 71,114 ----
static int bufsize = 1024;
/*
* return an array of IP_ADAPTER_ADDRESSES containing one element
! * for each adapter on the system. Returned in *adapters.
* Buffer is malloc'd and must be freed (unless error returned)
*/
static int getAdapters (JNIEnv *env, IP_ADAPTER_ADDRESSES **adapters) {
DWORD ret, flags;
IP_ADAPTER_ADDRESSES *adapterInfo;
ULONG len;
adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
!
! if (adapterInfo == NULL) {
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
return -1;
}
+
len = bufsize;
flags = GAA_FLAG_SKIP_DNS_SERVER;
flags |= GAA_FLAG_SKIP_MULTICAST;
flags |= GAA_FLAG_INCLUDE_PREFIX;
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
+
if (ret == ERROR_BUFFER_OVERFLOW) {
! IP_ADAPTER_ADDRESSES * newAdapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
! if (newAdapterInfo == NULL) {
! free(adapterInfo);
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
return -1;
}
+
+ adapterInfo = newAdapterInfo;
+
bufsize = len;
ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
}
+
if (ret != ERROR_SUCCESS) {
free (adapterInfo);
JNU_ThrowByName(env, "java/lang/Error",
"IP Helper Library GetAdaptersAddresses function failed");
return -1;
*** 107,142 ****
return ERROR_SUCCESS;
}
/*
* return an array of IP_ADAPTER_ADDRESSES containing one element
! * for each apdapter on the system. Returned in *adapters.
* Buffer is malloc'd and must be freed (unless error returned)
*/
IP_ADAPTER_ADDRESSES *getAdapter (JNIEnv *env, jint index) {
DWORD flags, val;
IP_ADAPTER_ADDRESSES *adapterInfo, *ptr, *ret;
ULONG len;
adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
! if (adapterInfo == 0) {
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);
return NULL;
}
len = bufsize;
flags = GAA_FLAG_SKIP_DNS_SERVER;
flags |= GAA_FLAG_SKIP_MULTICAST;
flags |= GAA_FLAG_INCLUDE_PREFIX;
val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
if (val == ERROR_BUFFER_OVERFLOW) {
! adapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
! if (adapterInfo == 0) {
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);
return NULL;
}
bufsize = len;
val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
}
if (val != ERROR_SUCCESS) {
free (adapterInfo);
JNU_ThrowByName(env, "java/lang/Error",
"IP Helper Library GetAdaptersAddresses function failed");
return NULL;
--- 117,157 ----
return ERROR_SUCCESS;
}
/*
* return an array of IP_ADAPTER_ADDRESSES containing one element
! * for each adapter on the system. Returned in *adapters.
* Buffer is malloc'd and must be freed (unless error returned)
*/
IP_ADAPTER_ADDRESSES *getAdapter (JNIEnv *env, jint index) {
DWORD flags, val;
IP_ADAPTER_ADDRESSES *adapterInfo, *ptr, *ret;
ULONG len;
adapterInfo = (IP_ADAPTER_ADDRESSES *)malloc (bufsize);
! if (adapterInfo == NULL) {
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
return NULL;
}
len = bufsize;
flags = GAA_FLAG_SKIP_DNS_SERVER;
flags |= GAA_FLAG_SKIP_MULTICAST;
flags |= GAA_FLAG_INCLUDE_PREFIX;
val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
if (val == ERROR_BUFFER_OVERFLOW) {
! IP_ADAPTER_ADDRESSES * newAdapterInfo = (IP_ADAPTER_ADDRESSES *) realloc (adapterInfo, len);
! if (newAdapterInfo == NULL) {
! free(adapterInfo);
! JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
return NULL;
}
+
+ adapterInfo = newAdapterInfo;
+
bufsize = len;
val = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, adapterInfo, &len);
}
+
if (val != ERROR_SUCCESS) {
free (adapterInfo);
JNU_ThrowByName(env, "java/lang/Error",
"IP Helper Library GetAdaptersAddresses function failed");
return NULL;
*** 145,155 ****
--- 160,178 ----
ret = NULL;
while (ptr != NULL) {
// IPv4 interface
if (ptr->Ipv6IfIndex == index) {
ret = (IP_ADAPTER_ADDRESSES *) malloc(sizeof(IP_ADAPTER_ADDRESSES));
+ if (ret == NULL) {
+ free(adapterInfo);
+ JNU_ThrowByName(env, "java/lang/OutOfMemoryError", "Native heap allocation failure");
+ return NULL;
+ }
+
+ //copy the memory and break out of the while loop.
memcpy(ret, ptr, sizeof(IP_ADAPTER_ADDRESSES));
+ break;
}
ptr=ptr->Next;
}
free(adapterInfo);
return ret;
*** 160,175 ****
/*
*/
int getAllInterfacesAndAddresses (JNIEnv *env, netif **netifPP)
{
DWORD ret;
! IP_ADAPTER_ADDRESSES *ptr, *adapters=0;
ULONG len=ipinflen, count=0;
! netif *nif=0, *dup_nif, *last=0, *loopif=0, *curr;
int tun=0, net=0;
! *netifPP = 0;
/*
* Get the IPv4 interfaces. This information is the same
* as what previous JDK versions would return.
*/
--- 183,198 ----
/*
*/
int getAllInterfacesAndAddresses (JNIEnv *env, netif **netifPP)
{
DWORD ret;
! IP_ADAPTER_ADDRESSES *ptr, *adapters=NULL;
ULONG len=ipinflen, count=0;
! netif *nif=NULL, *dup_nif, *last=NULL, *loopif=NULL, *curr;
int tun=0, net=0;
! *netifPP = NULL;
/*
* Get the IPv4 interfaces. This information is the same
* as what previous JDK versions would return.
*/
*** 180,190 ****
} else {
count = ret;
}
/* locate the loopback (and the last) interface */
! for (nif=*netifPP, last=nif; nif!=0; nif=nif->next) {
if (nif->ifType == MIB_IF_TYPE_LOOPBACK) {
loopif = nif;
}
last = nif;
}
--- 203,213 ----
} else {
count = ret;
}
/* locate the loopback (and the last) interface */
! for (nif=*netifPP, last=nif; nif!=NULL; nif=nif->next) {
if (nif->ifType == MIB_IF_TYPE_LOOPBACK) {
loopif = nif;
}
last = nif;
}
*** 232,242 ****
loopif->naddrs += c;
} else {
int index = ptr->IfIndex;
if (index != 0) {
/* This entry is associated with an IPv4 interface */
! for (nif=*netifPP; nif!=0; nif=nif->next) {
if (nif->index == index) {
/* found the interface entry
* set the index to the IPv6 index and add the
* IPv6 addresses
*/
--- 255,265 ----
loopif->naddrs += c;
} else {
int index = ptr->IfIndex;
if (index != 0) {
/* This entry is associated with an IPv4 interface */
! for (nif=*netifPP; nif!=NULL; nif=nif->next) {
if (nif->index == index) {
/* found the interface entry
* set the index to the IPv6 index and add the
* IPv6 addresses
*/
*** 255,265 ****
* for tunnel interfaces when there are multiple
* physical adapters. Need to check
* if this is a duplicate (ipv6Index is the same)
*/
dup_nif = 0;
! for (nif0=*netifPP; nif0!=0; nif0=nif0->next) {
if (nif0->hasIpv6Address &&
ptr->Ipv6IfIndex == nif0->ipv6Index) {
dup_nif = nif0;
break;
}
--- 278,288 ----
* for tunnel interfaces when there are multiple
* physical adapters. Need to check
* if this is a duplicate (ipv6Index is the same)
*/
dup_nif = 0;
! for (nif0=*netifPP; nif0!=NULL; nif0=nif0->next) {
if (nif0->hasIpv6Address &&
ptr->Ipv6IfIndex == nif0->ipv6Index) {
dup_nif = nif0;
break;
}
*** 334,352 ****
*/
static int getAddrsFromAdapter(IP_ADAPTER_ADDRESSES *ptr, netaddr **netaddrPP) {
LPSOCKADDR sock;
int count = 0;
! netaddr *curr, *start=0, *prev=0;
PIP_ADAPTER_UNICAST_ADDRESS uni_addr;
PIP_ADAPTER_ANYCAST_ADDRESS any_addr;
PIP_ADAPTER_PREFIX prefix;
/* If chain passed in, find end */
if (*netaddrPP != NULL) {
! for (start=*netaddrPP; start->next!=NULL; start=start->next) {
! }
prev=start;
}
prefix = ptr->FirstPrefix;
/* Unicast */
--- 357,376 ----
*/
static int getAddrsFromAdapter(IP_ADAPTER_ADDRESSES *ptr, netaddr **netaddrPP) {
LPSOCKADDR sock;
int count = 0;
! netaddr *curr, *start = NULL, *prev = NULL;
PIP_ADAPTER_UNICAST_ADDRESS uni_addr;
PIP_ADAPTER_ANYCAST_ADDRESS any_addr;
PIP_ADAPTER_PREFIX prefix;
/* If chain passed in, find end */
if (*netaddrPP != NULL) {
! for (start=*netaddrPP; start->next!=NULL; start=start->next)
! ;
!
prev=start;
}
prefix = ptr->FirstPrefix;
/* Unicast */
*** 362,380 ****
uni_addr = uni_addr->Next;
continue;
}
curr = (netaddr *)calloc (1, sizeof (netaddr));
! if (curr == 0) {
! return -1;
! }
! if (start == NULL) {
start = curr;
! }
! if (prev != NULL) {
prev->next = curr;
! }
prev = curr;
SOCKETADDRESS_COPY (&curr->addr, sock);
if (prefix != NULL) {
curr->mask = (short)prefix->PrefixLength;
prefix = prefix->Next;
--- 386,405 ----
uni_addr = uni_addr->Next;
continue;
}
curr = (netaddr *)calloc (1, sizeof (netaddr));
!
! if (curr == NULL)
! goto freeAllocatedMemory;
!
! if (start == NULL)
start = curr;
!
! if (prev != NULL)
prev->next = curr;
!
prev = curr;
SOCKETADDRESS_COPY (&curr->addr, sock);
if (prefix != NULL) {
curr->mask = (short)prefix->PrefixLength;
prefix = prefix->Next;
*** 385,413 ****
}
/* Anycast */
any_addr = ptr->FirstAnycastAddress;
while (any_addr != NULL) {
curr = (netaddr *)calloc (1, sizeof (netaddr));
! if (curr == 0) {
! return -1;
! }
! if (start == NULL) {
start = curr;
! }
! if (prev != NULL) {
prev->next = curr;
! }
prev = curr;
sock = any_addr->Address.lpSockaddr;
SOCKETADDRESS_COPY (&curr->addr, sock);
count ++;
any_addr = any_addr->Next;
}
if (*netaddrPP == NULL) {
*netaddrPP = start;
}
return count;
}
/*
* Create a NetworkInterface object, populate the name and index, and
* populate the InetAddress array based on the IP addresses for this
--- 410,458 ----
}
/* Anycast */
any_addr = ptr->FirstAnycastAddress;
while (any_addr != NULL) {
curr = (netaddr *)calloc (1, sizeof (netaddr));
!
! if (curr == NULL)
! goto freeAllocatedMemory;
!
! if (start == NULL)
start = curr;
!
! if (prev != NULL)
prev->next = curr;
!
prev = curr;
sock = any_addr->Address.lpSockaddr;
SOCKETADDRESS_COPY (&curr->addr, sock);
count ++;
any_addr = any_addr->Next;
}
if (*netaddrPP == NULL) {
*netaddrPP = start;
}
return count;
+
+ freeAllocatedMemory:
+
+ if (*netaddrPP != NULL) {
+ // We started with an existing list
+ curr=start->next;
+ //N.B. the variable "start" cannot be NULL at this point because of the fact that *netaddrPP isn't NULL.
+ start->next = NULL;
+ start = curr;
+ }
+ // otherwise, "start" points to the beginning of an incomplete list that we must deallocate.
+
+ while (start != NULL) {
+ curr = start->next;
+ free(start);
+ start = curr;
+ }
+
+ return -1;
}
/*
* Create a NetworkInterface object, populate the name and index, and
* populate the InetAddress array based on the IP addresses for this