From c3a3a0c424322009fec3ab735fb20ce8f6e19e70 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Fri, 13 Dec 2019 14:01:30 -0800 Subject: [PATCH] [commissioner] use strnlen instead of strlen (#4404) --- src/core/meshcop/commissioner.cpp | 34 ++++++++++++++++++------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 9f09b280d..de8811b50 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -255,7 +255,8 @@ otError Commissioner::AddJoiner(const Mac::ExtAddress *aEui64, const char *aPskd VerifyOrExit(mState == OT_COMMISSIONER_STATE_ACTIVE, error = OT_ERROR_INVALID_STATE); - VerifyOrExit(strlen(aPskd) <= Dtls::kPskMaxLength, error = OT_ERROR_INVALID_ARGS); + VerifyOrExit(strnlen(aPskd, Dtls::kPskMaxLength + 1) <= Dtls::kPskMaxLength, error = OT_ERROR_INVALID_ARGS); + RemoveJoiner(aEui64, 0); // remove immediately for (Joiner *joiner = &mJoiners[0]; joiner < OT_ARRAY_END(mJoiners); joiner++) @@ -1103,28 +1104,33 @@ otError Commissioner::GeneratePskc(const char * aPassPhrase, const Mac::ExtendedPanId &aExtPanId, Pskc & aPskc) { - otError error = OT_ERROR_NONE; - const char *saltPrefix = "Thread"; - uint8_t salt[OT_PBKDF2_SALT_MAX_LEN]; - uint16_t saltLen = 0; + otError error = OT_ERROR_NONE; + const char saltPrefix[] = "Thread"; + uint8_t salt[OT_PBKDF2_SALT_MAX_LEN]; + uint16_t saltLen = 0; + uint16_t passphraseLen; + uint8_t networkNameLen; - VerifyOrExit((strlen(aPassPhrase) >= OT_COMMISSIONING_PASSPHRASE_MIN_SIZE) && - (strlen(aPassPhrase) <= OT_COMMISSIONING_PASSPHRASE_MAX_SIZE) && - (strlen(aNetworkName) <= OT_NETWORK_NAME_MAX_SIZE), + passphraseLen = static_cast(strnlen(aPassPhrase, OT_COMMISSIONING_PASSPHRASE_MAX_SIZE + 1)); + networkNameLen = static_cast(strnlen(aNetworkName, OT_NETWORK_NAME_MAX_SIZE + 1)); + + VerifyOrExit((passphraseLen >= OT_COMMISSIONING_PASSPHRASE_MIN_SIZE) && + (passphraseLen <= OT_COMMISSIONING_PASSPHRASE_MAX_SIZE) && + (networkNameLen <= OT_NETWORK_NAME_MAX_SIZE), error = OT_ERROR_INVALID_ARGS); memset(salt, 0, sizeof(salt)); - memcpy(salt, saltPrefix, strlen(saltPrefix)); - saltLen += static_cast(strlen(saltPrefix)); + memcpy(salt, saltPrefix, sizeof(saltPrefix) - 1); + saltLen += static_cast(sizeof(saltPrefix) - 1); memcpy(salt + saltLen, aExtPanId.m8, sizeof(aExtPanId)); saltLen += OT_EXT_PAN_ID_SIZE; - memcpy(salt + saltLen, aNetworkName, strlen(aNetworkName)); - saltLen += static_cast(strlen(aNetworkName)); + memcpy(salt + saltLen, aNetworkName, networkNameLen); + saltLen += networkNameLen; - otPbkdf2Cmac(reinterpret_cast(aPassPhrase), static_cast(strlen(aPassPhrase)), - reinterpret_cast(salt), saltLen, 16384, OT_PSKC_MAX_SIZE, aPskc.m8); + otPbkdf2Cmac(reinterpret_cast(aPassPhrase), passphraseLen, reinterpret_cast(salt), + saltLen, 16384, OT_PSKC_MAX_SIZE, aPskc.m8); exit: return error;