From f2d4e1a828a93528d5e89da35b6a42fecdf9952a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 19 Aug 2010 06:05:35 +0000 Subject: [PATCH] [IPHLPAPI] - Copy our TCP table into the caller's buffer if we actually get one (not yet!) - Return ERROR_NO_DATA if we fail to get anything from TCP/IP - Fixes bug #4185 svn path=/trunk/; revision=48563 --- reactos/dll/win32/iphlpapi/iphlpapi_main.c | 33 +++++++++++++++------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/iphlpapi/iphlpapi_main.c b/reactos/dll/win32/iphlpapi/iphlpapi_main.c index 717fd2dee67..ebb73ad6017 100644 --- a/reactos/dll/win32/iphlpapi/iphlpapi_main.c +++ b/reactos/dll/win32/iphlpapi/iphlpapi_main.c @@ -1747,7 +1747,7 @@ static int TcpTableSorter(const void *a, const void *b) */ DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder) { - DWORD ret = NO_ERROR; + DWORD ret = ERROR_NO_DATA; TRACE("pTcpTable %p, pdwSize %p, bOrder %d\n", pTcpTable, pdwSize, (DWORD)bOrder); @@ -1764,18 +1764,31 @@ DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder) ret = ERROR_INSUFFICIENT_BUFFER; } else { - PMIB_TCPTABLE pTcpTable = getTcpTable(); - if (pTcpTable) + PMIB_TCPTABLE pOurTcpTable = getTcpTable(); + if (pOurTcpTable) { size = sizeof(MIB_TCPTABLE); - if (pTcpTable->dwNumEntries > 1) - size += (pTcpTable->dwNumEntries - 1) * sizeof(MIB_TCPROW); - *pdwSize = size; + if (pOurTcpTable->dwNumEntries > 1) + size += (pOurTcpTable->dwNumEntries - 1) * sizeof(MIB_TCPROW); + + if (*pdwSize < size) + { + *pdwSize = size; - if (bOrder) - qsort(pTcpTable->table, pTcpTable->dwNumEntries, - sizeof(MIB_TCPROW), TcpTableSorter); - ret = NO_ERROR; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else + { + memcpy(pTcpTable, pOurTcpTable, size); + + if (bOrder) + qsort(pTcpTable->table, pTcpTable->dwNumEntries, + sizeof(MIB_TCPROW), TcpTableSorter); + + ret = NO_ERROR; + } + + free(pOurTcpTable); } } }