Ensure that Network Name strings are NULL-termianted for client code. (#368)

* otGetNetworkName() no longer returns a pointer into a beacon message.
* Scan results no longer point into a beacon message.
This commit is contained in:
Jonathan Hui
2016-08-12 11:07:09 -07:00
committed by GitHub
parent 7d9b65e7a1
commit 8252cd6277
9 changed files with 51 additions and 54 deletions
+12 -12
View File
@@ -142,7 +142,7 @@ typedef struct otMasterKey
uint8_t m8[OT_MASTER_KEY_SIZE];
} otMasterKey;
#define OT_NETWORK_NAME_SIZE 16 ///< Size of the Thread Network Name field (bytes)
#define OT_NETWORK_NAME_MAX_SIZE 16 ///< Maximum size of the Thread Network Name field (bytes)
/**
* This structure represents a Network Name.
@@ -150,7 +150,7 @@ typedef struct otMasterKey
*/
typedef struct otNetworkName
{
char m8[OT_NETWORK_NAME_SIZE];
char m8[OT_NETWORK_NAME_MAX_SIZE + 1];
} otNetworkName;
#define OT_EXT_PAN_ID_SIZE 8 ///< Size of a Thread PAN ID (bytes)
@@ -247,16 +247,16 @@ typedef OT_TOOL_PACKED_BEGIN struct otIp6Address
*/
typedef struct otActiveScanResult
{
otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address
const char *mNetworkName; ///< Thread Network Name
const uint8_t *mExtPanId; ///< Thread Extended PAN ID
uint16_t mPanId; ///< IEEE 802.15.4 PAN ID
uint8_t mChannel; ///< IEEE 802.15.4 Channel
int8_t mRssi; ///< RSSI (dBm)
uint8_t mLqi; ///< LQI
unsigned int mVersion : 4; ///< Version
bool mIsNative : 1; ///< Native Commissioner flag
bool mIsJoinable : 1; ///< Joining Permitted flag
otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address
otNetworkName mNetworkName; ///< Thread Network Name
otExtendedPanId mExtendedPanId; ///< Thread Extended PAN ID
uint16_t mPanId; ///< IEEE 802.15.4 PAN ID
uint8_t mChannel; ///< IEEE 802.15.4 Channel
int8_t mRssi; ///< RSSI (dBm)
uint8_t mLqi; ///< LQI
unsigned int mVersion : 4; ///< Version
bool mIsNative : 1; ///< Native Commissioner flag
bool mIsJoinable : 1; ///< Joining Permitted flag
} otActiveScanResult;
/**
+5 -19
View File
@@ -883,7 +883,7 @@ void Interpreter::ProcessNetworkName(int argc, char *argv[])
if (argc == 0)
{
sServer->OutputFormat("%.*s\r\n", OT_NETWORK_NAME_SIZE, otGetNetworkName());
sServer->OutputFormat("%.*s\r\n", OT_NETWORK_NAME_MAX_SIZE, otGetNetworkName());
}
else
{
@@ -1456,25 +1456,11 @@ void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult)
sServer->OutputFormat("| %d ", aResult->mIsJoinable);
if (aResult->mNetworkName != NULL)
{
sServer->OutputFormat("| %-16s ", aResult->mNetworkName);
}
else
{
sServer->OutputFormat("| ---------------- ");
}
sServer->OutputFormat("| %-16s ", aResult->mNetworkName.m8);
if (aResult->mExtPanId != NULL)
{
sServer->OutputFormat("| ");
OutputBytes(aResult->mExtPanId, OT_EXT_PAN_ID_SIZE);
sServer->OutputFormat(" ");
}
else
{
sServer->OutputFormat("| ---------------- ");
}
sServer->OutputFormat("| ");
OutputBytes(aResult->mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE);
sServer->OutputFormat(" ");
sServer->OutputFormat("| %04x | ", aResult->mPanId);
OutputBytes(aResult->mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
+1 -1
View File
@@ -306,7 +306,7 @@ ThreadError Dataset::ProcessNetworkName(int argc, char *argv[])
size_t length;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
VerifyOrExit((length = strlen(argv[0])) <= OT_NETWORK_NAME_SIZE, error = kThreadError_Parse);
VerifyOrExit((length = strlen(argv[0])) <= OT_NETWORK_NAME_MAX_SIZE, error = kThreadError_Parse);
memset(&sDataset.mNetworkName, 0, sizeof(sDataset.mNetworkName));
memcpy(sDataset.mNetworkName.m8, argv[0], length);
+23 -11
View File
@@ -85,7 +85,6 @@ Mac::Mac(ThreadNetif &aThreadNetif):
mCsmaAttempts = 0;
mTransmitAttempts = 0;
mTransmitBeacon = false;
mBeacon.Init();
mActiveScanRequest = false;
mScanChannel = kPhyMinChannel;
@@ -241,13 +240,20 @@ ThreadError Mac::SetChannel(uint8_t aChannel)
const char *Mac::GetNetworkName(void) const
{
return mBeacon.GetNetworkName();
return mNetworkName.m8;
}
ThreadError Mac::SetNetworkName(const char *aNetworkName)
{
mBeacon.SetNetworkName(aNetworkName);
return kThreadError_None;
ThreadError error = kThreadError_None;
VerifyOrExit(strlen(aNetworkName) <= OT_NETWORK_NAME_MAX_SIZE, error = kThreadError_InvalidArgs);
memset(&mNetworkName, 0, sizeof(mNetworkName));
strncpy(mNetworkName.m8, aNetworkName, sizeof(mNetworkName));
exit:
return error;
}
PanId Mac::GetPanId(void) const
@@ -263,12 +269,12 @@ ThreadError Mac::SetPanId(PanId aPanId)
const uint8_t *Mac::GetExtendedPanId(void) const
{
return mBeacon.GetExtendedPanId();
return mExtendedPanId.m8;
}
ThreadError Mac::SetExtendedPanId(const uint8_t *aExtPanId)
{
mBeacon.SetExtendedPanId(aExtPanId);
memcpy(mExtendedPanId.m8, aExtPanId, sizeof(mExtendedPanId));
return kThreadError_None;
}
@@ -382,6 +388,7 @@ void Mac::SendBeaconRequest(Frame &aFrame)
void Mac::SendBeacon(Frame &aFrame)
{
uint8_t numUnsecurePorts;
Beacon *beacon;
uint16_t fcf;
// initialize MAC header
@@ -390,21 +397,26 @@ void Mac::SendBeacon(Frame &aFrame)
aFrame.SetSrcPanId(mPanId);
aFrame.SetSrcAddr(mExtAddress);
// write payload
beacon = reinterpret_cast<Beacon *>(aFrame.GetPayload());
beacon->Init();
// set the Joining Permitted flag
mNetif.GetIp6Filter().GetUnsecurePorts(numUnsecurePorts);
if (numUnsecurePorts)
{
mBeacon.SetJoiningPermitted();
beacon->SetJoiningPermitted();
}
else
{
mBeacon.ClearJoiningPermitted();
beacon->ClearJoiningPermitted();
}
// write payload
memcpy(aFrame.GetPayload(), &mBeacon, sizeof(mBeacon));
aFrame.SetPayloadLength(sizeof(mBeacon));
beacon->SetNetworkName(mNetworkName.m8);
beacon->SetExtendedPanId(mExtendedPanId.m8);
aFrame.SetPayloadLength(sizeof(*beacon));
otLogInfoMac("Sent Beacon\n");
}
+2 -1
View File
@@ -471,7 +471,8 @@ private:
PanId mPanId;
uint8_t mChannel;
Beacon mBeacon;
otNetworkName mNetworkName;
otExtendedPanId mExtendedPanId;
Sender *mSendHead, *mSendTail;
Receiver *mReceiveHead, *mReceiveTail;
+2 -2
View File
@@ -928,8 +928,8 @@ void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame)
result.mVersion = beacon->GetProtocolVersion();
result.mIsJoinable = beacon->IsJoiningPermitted();
result.mIsNative = beacon->IsNative();
result.mNetworkName = beacon->GetNetworkName();
result.mExtPanId = beacon->GetExtendedPanId();
memcpy(&result.mNetworkName, beacon->GetNetworkName(), sizeof(result.mNetworkName));
memcpy(&result.mExtendedPanId, beacon->GetExtendedPanId(), sizeof(result.mExtendedPanId));
}
handler(&result);
+2 -1
View File
@@ -321,10 +321,11 @@ public:
void SetNetworkName(const char *aNetworkName) {
size_t length = strnlen(aNetworkName, sizeof(mNetworkName));
memcpy(mNetworkName, aNetworkName, length);
SetLength(static_cast<uint8_t>(length));
}
private:
char mNetworkName[OT_NETWORK_NAME_SIZE];
char mNetworkName[OT_NETWORK_NAME_MAX_SIZE];
} OT_TOOL_PACKED_END;
/**
+2 -5
View File
@@ -2235,7 +2235,6 @@ ThreadError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Mes
otActiveScanResult result;
uint16_t offset;
uint16_t end;
char networkNameBuf[OT_NETWORK_NAME_SIZE];
otLogInfoMle("Handle discovery response\n");
@@ -2284,15 +2283,13 @@ ThreadError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Mes
case MeshCoP::Tlv::kExtendedPanId:
aMessage.Read(offset, sizeof(extPanId), &extPanId);
VerifyOrExit(extPanId.IsValid(), error = kThreadError_Parse);
result.mExtPanId = extPanId.GetExtendedPanId();
memcpy(&result.mExtendedPanId, extPanId.GetExtendedPanId(), sizeof(result.mExtendedPanId));
break;
case MeshCoP::Tlv::kNetworkName:
aMessage.Read(offset, sizeof(networkName), &networkName);
VerifyOrExit(networkName.IsValid(), error = kThreadError_Parse);
memcpy(networkNameBuf, networkName.GetNetworkName(), networkName.GetLength());
memset(networkNameBuf + networkName.GetLength(), 0, sizeof(networkNameBuf) - networkName.GetLength());
result.mNetworkName = networkNameBuf;
memcpy(&result.mNetworkName, networkName.GetNetworkName(), networkName.GetLength());
break;
default:
+2 -2
View File
@@ -455,8 +455,8 @@ void NcpBase::HandleActiveScanResult(otActiveScanResult *result)
result->mLqi,
SPINEL_PROTOCOL_TYPE_THREAD,
flags,
result->mNetworkName,
result->mExtPanId, OT_EXT_PAN_ID_SIZE
result->mNetworkName.m8,
result->mExtendedPanId.m8, OT_EXT_PAN_ID_SIZE
);
}
else