Hi,
It is an old bug: assign >=2 ip addresses to one adapter under Win32.
media-update branch tries to fix it, but the fix is not complete. The new
problem is a missing (numAddresses<maxAddresses) check in the inner loop.
That's why VS2005 complains about stack corruption round local variable "const
char* szAdapters[1] ;" when sipxInitialize() returns.
=========== the code in media-update branch at version 8187 =========
bool getAllLocalHostIps(const HostAdapterAddress* localHostAddresses[], int
&numAddresses)
{
bool rc = false;
#ifdef _WIN32
if (loadIPHelperAPI())
{
PIP_ADAPTER_INFO pIpAdapterInfo =
(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO) * MAX_IP_ADDRESSES);
unsigned long outBufLen = sizeof(IP_ADAPTER_INFO) * MAX_IP_ADDRESSES;
DWORD dwResult = GetAdaptersInfo(pIpAdapterInfo, &outBufLen);
if (ERROR_SUCCESS == dwResult)
{
int maxAddresses = numAddresses;
rc = true;
numAddresses = 0;
PIP_ADAPTER_INFO pNextInfoRecord = pIpAdapterInfo;
unsigned int adapterId = 0;
char szAdapterId[MAX_IP_ADDRESSES];
while (pNextInfoRecord && (numAddresses<maxAddresses))
{
sprintf(szAdapterId, "eth%u", adapterId);
PIP_ADDR_STRING pNextAddress = &pNextInfoRecord->IpAddressList;
while (pNextAddress)
{
const char *szAddr = pNextAddress->IpAddress.String;
// ignore the loopback address
if (!( strcmp(szAddr, "127.0.0.1") == 0 || strcmp(szAddr,
"0.0.0.0") == 0 ||
strncmp("169.154", szAddr,
7) == 0 || strncmp("0.", szAddr, 2) == 0) )
{
localHostAddresses[numAddresses] = new
HostAdapterAddress(szAdapterId, szAddr);
numAddresses++;
}
pNextAddress = pNextAddress->Next;
}
adapterId++;
pNextInfoRecord = pNextInfoRecord->Next;
}
}
free((void*)pIpAdapterInfo);
}
#else
rc = false;
#endif
return rc;
}
============== my suggested fix =============================
bool getAllLocalHostIps(const HostAdapterAddress* localHostAddresses[], int
&numAddresses)
{
bool rc = false;
#ifdef _WIN32
if (loadIPHelperAPI())
{
PIP_ADAPTER_INFO pIpAdapterInfo =
(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO) * MAX_IP_ADDRESSES);
unsigned long outBufLen = sizeof(IP_ADAPTER_INFO) * MAX_IP_ADDRESSES;
DWORD dwResult = GetAdaptersInfo(pIpAdapterInfo, &outBufLen);
if (ERROR_SUCCESS == dwResult)
{
int maxAddresses = numAddresses;
rc = true;
numAddresses = 0;
PIP_ADAPTER_INFO pNextInfoRecord = pIpAdapterInfo;
unsigned int adapterId = 0;
char szAdapterId[MAX_IP_ADDRESSES];
while (pNextInfoRecord && (numAddresses<maxAddresses))
{
sprintf(szAdapterId, "eth%u", adapterId);
PIP_ADDR_STRING pNextAddr = &pNextInfoRecord->IpAddressList;
do {
const char *szAddr = pNextAddr->IpAddress.String;
// ignore the loopback address
if (strcmp(szAddr, "127.0.0.1")
&& strcmp(szAddr, "0.0.0.0")
&& strncmp("169.154", szAddr, 7)
&& strncmp("0.", szAddr, 2))
{
localHostAddresses[numAddresses] = new
HostAdapterAddress(szAdapterId, szAddr);
numAddresses++;
}
pNextAddr = pNextAddr->Next;
} while (pNextAddr && (numAddresses<maxAddresses));
adapterId++;
pNextInfoRecord = pNextInfoRecord->Next;
}
}
free((void*)pIpAdapterInfo);
}
#else
rc = false;
#endif
return rc;
}
================================================
_______________________________________________
sipxtapi-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipxtapi-dev/