From: Thomas Faber Date: Tue, 10 May 2016 17:53:36 +0000 (+0000) Subject: [IPHLPAPI] X-Git-Tag: ReactOS-0.4.2~637 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=bc4d7ba18423c542283f43943ea5c1f1688020c0 [IPHLPAPI] - Don't use uninitialized values in AllocateAndGet*TableFromStack functions. CID 716757 - Free buffers on failure CORE-11227 #resolve svn path=/trunk/; revision=71308 --- diff --git a/reactos/dll/win32/iphlpapi/iphlpapi_main.c b/reactos/dll/win32/iphlpapi/iphlpapi_main.c index 75be6ca7546..c8dec124a2a 100644 --- a/reactos/dll/win32/iphlpapi/iphlpapi_main.c +++ b/reactos/dll/win32/iphlpapi/iphlpapi_main.c @@ -117,10 +117,15 @@ DWORD WINAPI AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable, else { DWORD dwSize = 0; + *ppIfTable = NULL; ret = GetIfTable(*ppIfTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppIfTable = (PMIB_IFTABLE)HeapAlloc(heap, flags, dwSize); ret = GetIfTable(*ppIfTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppIfTable); + *ppIfTable = NULL; + } } } TRACE("returning %ld\n", ret); @@ -156,10 +161,15 @@ DWORD WINAPI AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable, else { DWORD dwSize = 0; + *ppIpAddrTable = NULL; ret = GetIpAddrTable(*ppIpAddrTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppIpAddrTable = (PMIB_IPADDRTABLE)HeapAlloc(heap, flags, dwSize); ret = GetIpAddrTable(*ppIpAddrTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppIpAddrTable); + *ppIpAddrTable = NULL; + } } } TRACE("returning %ld\n", ret); @@ -193,10 +203,15 @@ DWORD WINAPI AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE * else { DWORD dwSize = 0; + *ppIpForwardTable = NULL; ret = GetIpForwardTable(*ppIpForwardTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppIpForwardTable = (PMIB_IPFORWARDTABLE)HeapAlloc(heap, flags, dwSize); ret = GetIpForwardTable(*ppIpForwardTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppIpForwardTable); + *ppIpForwardTable = NULL; + } } } TRACE("returning %ld\n", ret); @@ -232,10 +247,15 @@ DWORD WINAPI AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, else { DWORD dwSize = 0; + *ppIpNetTable = NULL; ret = GetIpNetTable(*ppIpNetTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppIpNetTable = (PMIB_IPNETTABLE)HeapAlloc(heap, flags, dwSize); ret = GetIpNetTable(*ppIpNetTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppIpNetTable); + *ppIpNetTable = NULL; + } } } TRACE("returning %ld\n", ret); @@ -271,10 +291,15 @@ DWORD WINAPI AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable, else { DWORD dwSize = 0; + *ppTcpTable = NULL; ret = GetTcpTable(*ppTcpTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppTcpTable = (PMIB_TCPTABLE)HeapAlloc(heap, flags, dwSize); ret = GetTcpTable(*ppTcpTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppTcpTable); + *ppTcpTable = NULL; + } } } TRACE("returning %ld\n", ret); @@ -310,10 +335,15 @@ DWORD WINAPI AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, else { DWORD dwSize = 0; + *ppUdpTable = NULL; ret = GetUdpTable(*ppUdpTable, &dwSize, bOrder); if (ret == ERROR_INSUFFICIENT_BUFFER) { *ppUdpTable = (PMIB_UDPTABLE)HeapAlloc(heap, flags, dwSize); ret = GetUdpTable(*ppUdpTable, &dwSize, bOrder); + if (ret != NO_ERROR) { + HeapFree(heap, flags, *ppUdpTable); + *ppUdpTable = NULL; + } } } TRACE("returning %ld\n", ret);