diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index 4c4360822029cf..c1fd8635d33eb0 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -91,6 +91,29 @@ void initNetworkCommissioningThreadDriver(void) #endif } +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_DNS_CLIENT +CHIP_ERROR ReadDomainNameComponent(const char *& in, char * out, size_t outSize) +{ + const char * dotPos = strchr(in, '.'); + VerifyOrReturnError(dotPos != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + const size_t componentSize = static_cast(dotPos - in); + VerifyOrReturnError(componentSize < outSize, CHIP_ERROR_INVALID_ARGUMENT); + + memcpy(out, in, componentSize); + out[componentSize] = '\0'; + in += componentSize + 1; + + return CHIP_NO_ERROR; +} + +template +CHIP_ERROR ReadDomainNameComponent(const char *& in, char (&out)[N]) +{ + return ReadDomainNameComponent(in, out, N); +} +#endif + NetworkCommissioning::otScanResponseIterator mScanResponseIter; } // namespace @@ -2320,29 +2343,8 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::FromOtDnsRespons { char protocol[chip::Dnssd::kDnssdProtocolTextMaxSize + 1]; - if (strchr(serviceType, '.') == nullptr) - return CHIP_ERROR_INVALID_ARGUMENT; - - // Extract from the ... the part. - size_t substringSize = strchr(serviceType, '.') - serviceType; - if (substringSize >= ArraySize(mdnsService.mType)) - { - return CHIP_ERROR_INVALID_ARGUMENT; - } - Platform::CopyString(mdnsService.mType, substringSize + 1, serviceType); - - // Extract from the ... the part. - const char * protocolSubstringStart = serviceType + substringSize + 1; - - if (strchr(protocolSubstringStart, '.') == nullptr) - return CHIP_ERROR_INVALID_ARGUMENT; - - substringSize = strchr(protocolSubstringStart, '.') - protocolSubstringStart; - if (substringSize >= ArraySize(protocol)) - { - return CHIP_ERROR_INVALID_ARGUMENT; - } - Platform::CopyString(protocol, substringSize + 1, protocolSubstringStart); + ReturnErrorOnFailure(ReadDomainNameComponent(serviceType, mdnsService.mType)); + ReturnErrorOnFailure(ReadDomainNameComponent(serviceType, protocol)); if (strncmp(protocol, "_udp", chip::Dnssd::kDnssdProtocolTextMaxSize) == 0) { @@ -2357,24 +2359,20 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread::FromOtDnsRespons mdnsService.mProtocol = chip::Dnssd::DnssdServiceProtocol::kDnssdProtocolUnknown; } + mdnsService.mInterface = Inet::InterfaceId::Null(); + mdnsService.mSubTypeSize = 0; + mdnsService.mTextEntrySize = 0; + // Check if SRV record was included in DNS response. - if (error != OT_ERROR_NOT_FOUND) + // If not, return partial information about the service and exit early. + if (error != OT_ERROR_NONE) { - if (strchr(serviceInfo.mHostNameBuffer, '.') == nullptr) - return CHIP_ERROR_INVALID_ARGUMENT; - - // Extract from the .. the part. - substringSize = strchr(serviceInfo.mHostNameBuffer, '.') - serviceInfo.mHostNameBuffer; - if (substringSize >= ArraySize(mdnsService.mHostName)) - { - return CHIP_ERROR_INVALID_ARGUMENT; - } - Platform::CopyString(mdnsService.mHostName, substringSize + 1, serviceInfo.mHostNameBuffer); - - mdnsService.mPort = serviceInfo.mPort; + return CHIP_NO_ERROR; } - mdnsService.mInterface = Inet::InterfaceId::Null(); + const char * host = serviceInfo.mHostNameBuffer; + ReturnErrorOnFailure(ReadDomainNameComponent(host, mdnsService.mHostName)); + mdnsService.mPort = serviceInfo.mPort; // Check if AAAA record was included in DNS response.