static int DomainEndsInDot(const char *dom) { while (dom[0] && dom[1]) { if (dom[0] == '\\') // advance past escaped byte sequence { if (mDNSIsDigit(dom[1]) && mDNSIsDigit(dom[2]) && mDNSIsDigit(dom[3])) dom += 4; // If "\ddd" then skip four else dom += 2; // else if "\x" then skip two } else dom++; // else goto next character } return (dom[0] == '.'); }
mDNSlocal void handleLNTGetExternalAddressResponse(tcpLNTInfo *tcpInfo) { mDNS *m = tcpInfo->m; mDNSu16 err = NATErr_None; mDNSv4Addr ExtAddr; mDNSu8 *ptr = (mDNSu8*)tcpInfo->Reply; mDNSu8 *end = (mDNSu8*)tcpInfo->Reply + tcpInfo->nread; mDNSu8 *addrend; static char tagname[20] = "NewExternalIPAddress"; // Array NOT including a terminating nul // LogInfo("handleLNTGetExternalAddressResponse: %s", ptr); mDNSs16 http_result = ParseHTTPResponseCode(&ptr, end); // Note: modifies ptr if (http_result == HTTPCode_404) LNT_ClearState(m); if (http_result != HTTPCode_200) { mDNSASLLog((uuid_t *)&m->asl_uuid, "natt.legacy.AddressRequest", "noop", "HTTP Result", "HTTP code: %d", http_result); return; } while (ptr < end && strncasecmp((char*)ptr, tagname, sizeof(tagname))) ptr++; ptr += sizeof(tagname); // Skip over "NewExternalIPAddress" while (ptr < end && *ptr != '>') ptr++; ptr += 1; // Skip over ">" // Find the end of the address and terminate the string so inet_pton() can convert it addrend = ptr; while (addrend < end && (mDNSIsDigit(*addrend) || *addrend == '.')) addrend++; if (addrend >= end) return; *addrend = 0; if (inet_pton(AF_INET, (char*)ptr, &ExtAddr) <= 0) { mDNSASLLog((uuid_t *)&m->asl_uuid, "natt.legacy.AddressRequest", "noop", "inet_pton", ""); LogMsg("handleLNTGetExternalAddressResponse: Router returned bad address %s", ptr); err = NATErr_NetFail; ExtAddr = zerov4Addr; } if (!err) LogInfo("handleLNTGetExternalAddressResponse: External IP address is %.4a", &ExtAddr); natTraversalHandleAddressReply(m, err, ExtAddr); }