src/java.base/windows/native/libnet/Inet4AddressImpl.c

Print this page

        

*** 31,40 **** --- 31,41 ---- #include <malloc.h> #include <sys/types.h> #include <process.h> #include <iphlpapi.h> #include <icmpapi.h> + #include <WinError.h> #include "java_net_InetAddress.h" #include "java_net_Inet4AddressImpl.h" #include "net_util.h" #include "icmp.h"
*** 440,450 **** char SendData[32] = {0}; LPVOID ReplyBuffer = NULL; DWORD ReplySize = 0; jboolean ret = JNI_FALSE; ! ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); ReplyBuffer = (VOID*) malloc(ReplySize); if (ReplyBuffer == NULL) { IcmpCloseHandle(hIcmpFile); NET_ThrowNew(env, WSAGetLastError(), "Unable to allocate memory"); return JNI_FALSE; --- 441,459 ---- char SendData[32] = {0}; LPVOID ReplyBuffer = NULL; DWORD ReplySize = 0; jboolean ret = JNI_FALSE; ! // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366051%28v=vs.85%29.aspx ! ReplySize = sizeof(ICMP_ECHO_REPLY) // The buffer should be large enough ! // to hold at least one ICMP_ECHO_REPLY ! // structure ! + sizeof(SendData) // plus RequestSize bytes of data. ! + 8; // This buffer should also be large enough ! // to also hold 8 more bytes of data ! // (the size of an ICMP error message) ! ReplyBuffer = (VOID*) malloc(ReplySize); if (ReplyBuffer == NULL) { IcmpCloseHandle(hIcmpFile); NET_ThrowNew(env, WSAGetLastError(), "Unable to allocate memory"); return JNI_FALSE;
*** 476,490 **** ReplyBuffer,// LPVOID ReplyBuffer, ReplySize, // DWORD ReplySize, (timeout < 1000) ? 1000 : timeout); // DWORD Timeout } ! if (dwRetVal != 0) { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; ! if ((int)pEchoReply->RoundTripTime <= timeout) ret = JNI_TRUE; } free(ReplyBuffer); IcmpCloseHandle(hIcmpFile); return ret; --- 485,529 ---- ReplyBuffer,// LPVOID ReplyBuffer, ReplySize, // DWORD ReplySize, (timeout < 1000) ? 1000 : timeout); // DWORD Timeout } ! if (dwRetVal == 0) { // if the call failed ! TCHAR *buf; ! DWORD err = WSAGetLastError(); ! switch (err) { ! case ERROR_NO_NETWORK: ! case ERROR_NETWORK_UNREACHABLE: ! case ERROR_HOST_UNREACHABLE: ! case ERROR_PROTOCOL_UNREACHABLE: ! case ERROR_PORT_UNREACHABLE: ! case ERROR_REQUEST_ABORTED: ! case ERROR_INCORRECT_ADDRESS: ! case ERROR_HOST_DOWN: ! break; ! default: ! FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, ! NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), ! (LPTSTR)&buf, 0, NULL); ! NET_ThrowNew(env, err, buf); ! LocalFree(buf); ! break; ! } ! } else { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; ! ! // This is to take into account the undocumented minimum ! // timeout mentioned in the IcmpSendEcho call above. ! // We perform an extra check to make sure that our ! // roundtrip time was less than our desired timeout ! // for cases where that timeout is < 1000ms. ! if (pEchoReply->Status == IP_SUCCESS ! && (int)pEchoReply->RoundTripTime <= timeout) ! { ret = JNI_TRUE; } + } free(ReplyBuffer); IcmpCloseHandle(hIcmpFile); return ret;