diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp b/packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp index 81ecb15e260b..d1c46ebcadd9 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp @@ -11,7 +11,6 @@ #include #include -#include #include namespace facebook::react { @@ -20,34 +19,29 @@ void RawPropsKey::render(char* buffer, RawPropsPropNameLength* length) const noexcept { *length = 0; - // Prefix + constexpr size_t maxLength = kPropNameLengthHardCap - 1; + + auto appendSegment = [&](const char* segment) { + auto copyLen = std::min(std::strlen(segment), maxLength - *length); + std::memcpy(buffer + *length, segment, copyLen); + *length += static_cast(copyLen); + }; + if (prefix != nullptr) { - auto prefixLength = - static_cast(std::strlen(prefix)); - std::memcpy(buffer, prefix, prefixLength); - *length = prefixLength; + appendSegment(prefix); } - // Name - auto nameLength = static_cast(std::strlen(name)); - std::memcpy(buffer + *length, name, nameLength); - *length += nameLength; + appendSegment(name); - // Suffix if (suffix != nullptr) { - auto suffixLength = - static_cast(std::strlen(suffix)); - std::memcpy(buffer + *length, suffix, suffixLength); - *length += suffixLength; + appendSegment(suffix); } - react_native_assert(*length < kPropNameLengthHardCap); } RawPropsKey::operator std::string() const noexcept { auto buffer = std::array(); RawPropsPropNameLength length = 0; render(buffer.data(), &length); - react_native_assert(length < kPropNameLengthHardCap); return std::string{buffer.data(), length}; } diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp b/packages/react-native/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp index d555e293304d..81b0113658de 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp @@ -75,7 +75,7 @@ void RawPropsKeyMap::reindex() noexcept { buckets_.resize(kPropNameLengthHardCap); - auto length = RawPropsPropNameLength{0}; + RawPropsPropNameLength length = 0; for (size_t i = 0; i < items_.size(); i++) { auto& item = items_[i]; if (item.length != length) { @@ -96,6 +96,9 @@ RawPropsValueIndex RawPropsKeyMap::at( RawPropsPropNameLength length) noexcept { react_native_assert(length > 0); react_native_assert(length < kPropNameLengthHardCap); + if (length == 0 || length >= kPropNameLengthHardCap) [[unlikely]] { + return kRawPropsValueIndexEmpty; + } // 1. Find the bucket. auto lower = int{buckets_[length - 1]}; auto upper = int{buckets_[length]} - 1;