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