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/

Reply via email to