[srp-server] update to use HeapString for names (#6732)

This commit is contained in:
Abtin Keshavarzian
2021-06-16 12:26:03 -07:00
committed by Jonathan Hui
parent 2b2b3904f0
commit e3930f3c3f
2 changed files with 45 additions and 102 deletions
+34 -91
View File
@@ -80,7 +80,6 @@ Server::Server(Instance &aInstance)
, mSocket(aInstance)
, mServiceUpdateHandler(nullptr)
, mServiceUpdateHandlerContext(nullptr)
, mDomain(nullptr)
, mLeaseTimer(aInstance, HandleLeaseTimer)
, mOutstandingUpdatesTimer(aInstance, HandleOutstandingUpdatesTimer)
, mServiceUpdateId(Random::NonCrypto::GetUint32())
@@ -90,11 +89,6 @@ Server::Server(Instance &aInstance)
IgnoreError(SetDomain(kDefaultDomain));
}
Server::~Server(void)
{
Instance::HeapFree(mDomain);
}
void Server::SetServiceHandler(otSrpServerServiceUpdateHandler aServiceHandler, void *aServiceHandlerContext)
{
mServiceUpdateHandler = aServiceHandler;
@@ -173,36 +167,34 @@ exit:
Error Server::SetDomain(const char *aDomain)
{
Error error = kErrorNone;
char * buf = nullptr;
size_t appendTrailingDot = 0;
size_t length = strlen(aDomain);
Error error = kErrorNone;
uint16_t length;
VerifyOrExit(!mEnabled, error = kErrorInvalidState);
VerifyOrExit(length > 0 && length < Dns::Name::kMaxNameSize, error = kErrorInvalidArgs);
if (aDomain[length - 1] != '.')
length = StringLength(aDomain, Dns::Name::kMaxNameSize);
VerifyOrExit((length > 0) && (length < Dns::Name::kMaxNameSize), error = kErrorInvalidArgs);
if (aDomain[length - 1] == '.')
{
appendTrailingDot = 1;
error = mDomain.Set(aDomain);
}
buf = static_cast<char *>(Instance::HeapCAlloc(1, length + appendTrailingDot + 1));
VerifyOrExit(buf != nullptr, error = kErrorNoBufs);
strcpy(buf, aDomain);
if (appendTrailingDot)
else
{
// Need to append dot at the end
char buf[Dns::Name::kMaxNameSize];
VerifyOrExit(length < Dns::Name::kMaxNameSize - 1, error = kErrorInvalidArgs);
memcpy(buf, aDomain, length);
buf[length] = '.';
buf[length + 1] = '\0';
error = mDomain.Set(buf);
}
Instance::HeapFree(mDomain);
mDomain = buf;
exit:
if (error != kErrorNone)
{
Instance::HeapFree(buf);
}
return error;
}
@@ -228,13 +220,13 @@ void Server::RemoveHost(Host *aHost, bool aRetainName, bool aNotifyServiceHandle
if (aRetainName)
{
otLogInfoSrp("[server] remove host '%s' (but retain its name)", aHost->mFullName);
otLogInfoSrp("[server] remove host '%s' (but retain its name)", aHost->GetFullName());
}
else
{
aHost->mKeyLease = 0;
IgnoreError(mHosts.Remove(*aHost));
otLogInfoSrp("[server] fully remove host '%s'", aHost->mFullName);
otLogInfoSrp("[server] fully remove host '%s'", aHost->GetFullName());
}
if (aNotifyServiceHandler && mServiceUpdateHandler != nullptr)
@@ -286,7 +278,7 @@ bool Server::HasNameConflictsWith(Host &aHost) const
// Check not only services of this host but all hosts.
while ((service = aHost.GetNextService(service)) != nullptr)
{
const Service *existingService = FindService(service->mFullName);
const Service *existingService = FindService(service->GetFullName());
if (existingService != nullptr && *service->GetHost().GetKey() != *existingService->GetHost().GetKey())
{
ExitNow(hasConflicts = true);
@@ -383,7 +375,7 @@ void Server::CommitSrpUpdate(Error aError,
existingHost->CopyResourcesFrom(aHost);
while ((service = aHost.GetNextService(service)) != nullptr)
{
Service *existingService = existingHost->FindService(service->mFullName);
Service *existingService = existingHost->FindService(service->GetFullName());
if (service->mIsDeleted)
{
@@ -391,12 +383,12 @@ void Server::CommitSrpUpdate(Error aError,
}
else
{
Service *newService = existingHost->AddService(service->mFullName);
Service *newService = existingHost->AddService(service->GetFullName());
VerifyOrExit(newService != nullptr, aError = kErrorNoBufs);
SuccessOrExit(aError = newService->CopyResourcesFrom(*service));
otLogInfoSrp("[server] %s service %s", (existingService != nullptr) ? "update existing" : "add new",
service->mFullName);
service->GetFullName());
}
}
@@ -1030,7 +1022,7 @@ void Server::HandleUpdate(const Dns::UpdateHeader &aDnsHeader, Host *aHost, cons
{
if (!existingService->mIsDeleted)
{
Service *service = aHost->AddService(existingService->mFullName);
Service *service = aHost->AddService(existingService->GetFullName());
VerifyOrExit(service != nullptr, error = kErrorNoBufs);
service->mIsDeleted = true;
}
@@ -1216,7 +1208,7 @@ void Server::HandleLeaseTimer(void)
if (service->GetKeyExpireTime() <= now)
{
otLogInfoSrp("[server] KEY LEASE of service %s expired", service->mFullName);
otLogInfoSrp("[server] KEY LEASE of service %s expired", service->GetFullName());
host->RemoveService(service, /* aRetainName */ false, /* aNotifyServiceHandler */ true);
}
else
@@ -1264,7 +1256,7 @@ void Server::HandleLeaseTimer(void)
}
else if (service->GetExpireTime() <= now)
{
otLogInfoSrp("[server] LEASE of service %s expired", service->mFullName);
otLogInfoSrp("[server] LEASE of service %s expired", service->GetFullName());
// The service is expired, delete it.
host->RemoveService(service, /* aRetainName */ true, /* aNotifyServiceHandler */ true);
@@ -1332,14 +1324,13 @@ exit:
void Server::Service::Free(void)
{
Instance::HeapFree(mFullName);
mFullName.Free();
Instance::HeapFree(mTxtData);
Instance::HeapFree(this);
}
Server::Service::Service(void)
: mFullName(nullptr)
, mPriority(0)
: mPriority(0)
, mWeight(0)
, mPort(0)
, mTxtLength(0)
@@ -1350,23 +1341,6 @@ Server::Service::Service(void)
{
}
Error Server::Service::SetFullName(const char *aFullName)
{
OT_ASSERT(aFullName != nullptr);
Error error = kErrorNone;
char *nameCopy = static_cast<char *>(Instance::HeapCAlloc(1, strlen(aFullName) + 1));
VerifyOrExit(nameCopy != nullptr, error = kErrorNoBufs);
strcpy(nameCopy, aFullName);
Instance::HeapFree(mFullName);
mFullName = nameCopy;
exit:
return error;
}
TimeMilli Server::Service::GetExpireTime(void) const
{
OT_ASSERT(!mIsDeleted);
@@ -1450,23 +1424,18 @@ exit:
return error;
}
bool Server::Service::Matches(const char *aFullName) const
{
return (mFullName != nullptr) && (strcmp(mFullName, aFullName) == 0);
}
bool Server::Service::MatchesServiceName(const char *aServiceName) const
{
uint8_t i = static_cast<uint8_t>(strlen(mFullName));
uint8_t i = static_cast<uint8_t>(strlen(GetFullName()));
uint8_t j = static_cast<uint8_t>(strlen(aServiceName));
while (i > 0 && j > 0 && mFullName[i - 1] == aServiceName[j - 1])
while (i > 0 && j > 0 && GetFullName()[i - 1] == aServiceName[j - 1])
{
i--;
j--;
}
return j == 0 && i > 0 && mFullName[i - 1] == '.';
return j == 0 && i > 0 && GetFullName()[i - 1] == '.';
}
Server::Host *Server::Host::New(Instance &aInstance)
@@ -1486,13 +1455,12 @@ exit:
void Server::Host::Free(void)
{
FreeAllServices();
Instance::HeapFree(mFullName);
mFullName.Free();
Instance::HeapFree(this);
}
Server::Host::Host(Instance &aInstance)
: InstanceLocator(aInstance)
, mFullName(nullptr)
, mAddressesNum(0)
, mNext(nullptr)
, mLease(0)
@@ -1502,26 +1470,6 @@ Server::Host::Host(Instance &aInstance)
mKey.Clear();
}
Error Server::Host::SetFullName(const char *aFullName)
{
OT_ASSERT(aFullName != nullptr);
Error error = kErrorNone;
char *nameCopy = static_cast<char *>(Instance::HeapCAlloc(1, strlen(aFullName) + 1));
VerifyOrExit(nameCopy != nullptr, error = kErrorNoBufs);
strcpy(nameCopy, aFullName);
if (mFullName != nullptr)
{
Instance::HeapFree(mFullName);
}
mFullName = nameCopy;
exit:
return error;
}
void Server::Host::SetKey(Dns::Ecdsa256KeyRecord &aKey)
{
OT_ASSERT(aKey.IsValid());
@@ -1571,11 +1519,11 @@ void Server::Host::RemoveService(Service *aService, bool aRetainName, bool aNoti
if (aRetainName)
{
aService->ClearResources();
otLogInfoSrp("[server] remove service '%s' (but retain its name)", aService->mFullName);
otLogInfoSrp("[server] remove service '%s' (but retain its name)", aService->GetFullName());
}
else
{
otLogInfoSrp("[server] fully remove service '%s'", aService->mFullName);
otLogInfoSrp("[server] fully remove service '%s'", aService->GetFullName());
}
if (aNotifyServiceHandler && server.mServiceUpdateHandler != nullptr)
@@ -1665,11 +1613,6 @@ exit:
return error;
}
bool Server::Host::Matches(const char *aName) const
{
return mFullName != nullptr && strcmp(mFullName, aName) == 0;
}
Server::UpdateMetadata *Server::UpdateMetadata::New(Instance & aInstance,
const Dns::UpdateHeader &aHeader,
Host * aHost,
+11 -11
View File
@@ -50,6 +50,7 @@
#include <openthread/srp_server.h>
#include "common/clearable.hpp"
#include "common/heap_string.hpp"
#include "common/linked_list.hpp"
#include "common/locator.hpp"
#include "common/non_copyable.hpp"
@@ -137,7 +138,7 @@ public:
* @returns A pointer to the null-terminated service name string.
*
*/
const char *GetFullName(void) const { return mFullName; }
const char *GetFullName(void) const { return mFullName.AsCString(); }
/**
* This method returns the port of the service instance.
@@ -213,7 +214,7 @@ public:
* @returns TRUE if the service matches the full name, FALSE if doesn't match.
*
*/
bool Matches(const char *aFullName) const;
bool Matches(const char *aFullName) const { return (mFullName == aFullName); }
/**
* This method tells whether this service matches a given service name <Service>.<Domain>.
@@ -228,13 +229,13 @@ public:
private:
explicit Service(void);
Error SetFullName(const char *aFullName);
Error SetFullName(const char *aFullName) { return mFullName.Set(aFullName); }
Error SetTxtData(const uint8_t *aTxtData, uint16_t aTxtDataLength);
Error SetTxtDataFromMessage(const Message &aMessage, uint16_t aOffset, uint16_t aLength);
Error CopyResourcesFrom(const Service &aService);
void ClearResources(void);
char * mFullName;
HeapString mFullName;
uint16_t mPriority;
uint16_t mWeight;
uint16_t mPort;
@@ -291,7 +292,7 @@ public:
* @returns A pointer to the null-terminated full host name.
*
*/
const char *GetFullName(void) const { return mFullName; }
const char *GetFullName(void) const { return mFullName.AsCString(); }
/**
* This method returns addresses of the host.
@@ -369,7 +370,7 @@ public:
* @returns A boolean that indicates whether the host matches the given name.
*
*/
bool Matches(const char *aName) const;
bool Matches(const char *aFullName) const { return (mFullName == aFullName); }
private:
enum : uint8_t
@@ -378,7 +379,7 @@ public:
};
explicit Host(Instance &aInstance);
Error SetFullName(const char *aFullName);
Error SetFullName(const char *aFullName) { return mFullName.Set(aFullName); }
void SetKey(Dns::Ecdsa256KeyRecord &aKey);
void SetLease(uint32_t aLease) { mLease = aLease; }
void SetKeyLease(uint32_t aKeyLease) { mKeyLease = aKeyLease; }
@@ -392,7 +393,7 @@ public:
const Service *FindService(const char *aFullName) const;
Error AddIp6Address(const Ip6::Address &aIp6Address);
char * mFullName;
HeapString mFullName;
Ip6::Address mAddresses[kMaxAddressesNum];
uint8_t mAddressesNum;
Host * mNext;
@@ -432,7 +433,6 @@ public:
*
*/
explicit Server(Instance &aInstance);
~Server(void);
/**
* This method sets the SRP service events handler.
@@ -457,7 +457,7 @@ public:
* @returns A pointer to the dot-joined domain string.
*
*/
const char *GetDomain(void) const { return mDomain; }
const char *GetDomain(void) const { return mDomain.AsCString(); }
/**
* This method sets the domain on the SRP server.
@@ -662,7 +662,7 @@ private:
otSrpServerServiceUpdateHandler mServiceUpdateHandler;
void * mServiceUpdateHandlerContext;
char *mDomain;
HeapString mDomain;
LeaseConfig mLeaseConfig;