diff --git a/kv_store/src/kvstore_common/kvstore_common.c b/kv_store/src/kvstore_common/kvstore_common.c index 483a28e9b917a9fe7adbd59fe79d22e62c31998f..ce118960fdc23de6c9c6433142e581023614128b 100755 --- a/kv_store/src/kvstore_common/kvstore_common.c +++ b/kv_store/src/kvstore_common/kvstore_common.c @@ -45,6 +45,16 @@ boolean IsValidValue(const char* value, unsigned int len) return TRUE; } +static boolean IsValidValueInner(const char* value, size_t* actualSize) +{ + size_t valueLen = strnlen(value, MAX_VALUE_LEN); + *actualSize = valueLen; + if (valueLen >= MAX_VALUE_LEN || valueLen == 0) { + return FALSE; + } + return TRUE; +} + boolean IsValidKey(const char* key) { if (key == NULL || !IsValidValue(key, MAX_KEY_LEN)) { @@ -59,6 +69,21 @@ boolean IsValidKey(const char* key) return TRUE; } +static boolean IsValidKeyInner(const char* key, size_t* actualSize) +{ + size_t keyLen = strnlen(key, MAX_KEY_LEN); + *actualSize = keyLen; + if (keyLen >= MAX_KEY_LEN || keyLen == 0) { + return FALSE; + } + for (size_t i = 0; i < keyLen; i++) { + if (!IsValidChar(key[i])) { + return FALSE; + } + } + return TRUE; +} + #ifdef FEATURE_KV_CACHE static void FreeItem(KvItem* item) { @@ -106,15 +131,13 @@ void DeleteKVCache(const char* key) void AddKVCache(const char* key, const char* value, boolean isNew) { - if (key == NULL || value == NULL) { + size_t keyLen = 0; + size_t valueLen = 0; + if (key == NULL || value == NULL || !IsValidKeyInner(key, &keyLen) || + !IsValidValueInner(value, &valueLen)) { return; } - size_t keyLen = strnlen(key, MAX_KEY_LEN); - size_t valueLen = strnlen(value, MAX_VALUE_LEN); - if ((keyLen >= MAX_KEY_LEN) || (valueLen >= MAX_VALUE_LEN)) { - return; - } if (isNew) { DeleteKVCache(key); } @@ -168,11 +191,11 @@ int GetValueByCache(const char* key, char* value, unsigned int maxLen) return EC_FAILURE; } } - size_t valueLen = strnlen(item->value, MAX_VALUE_LEN); - if (valueLen >= MAX_VALUE_LEN) { + + if (maxLen < MAX_VALUE_LEN) { return EC_FAILURE; } - if ((valueLen >= maxLen) || (strcpy_s(value, maxLen, item->value) != EOK)) { + if (strcpy_s(value, maxLen, item->value) != EOK) { return EC_FAILURE; } return EC_SUCCESS;