1
0
Fork 0
forked from suyu/suyu

Merge pull request #7172 from Morph1984/out-of-bounds

string_util: Prevent out of bounds access in u16string_view buffer
This commit is contained in:
Mai M 2021-10-15 17:04:44 -04:00 committed by GitHub
commit 764369f4c7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 7 deletions

View file

@ -180,20 +180,20 @@ std::wstring UTF8ToUTF16W(const std::string& input) {
#endif #endif
std::string StringFromFixedZeroTerminatedBuffer(const char* buffer, std::size_t max_len) { std::string StringFromFixedZeroTerminatedBuffer(std::string_view buffer, std::size_t max_len) {
std::size_t len = 0; std::size_t len = 0;
while (len < max_len && buffer[len] != '\0') while (len < buffer.length() && len < max_len && buffer[len] != '\0') {
++len; ++len;
}
return std::string(buffer, len); return std::string(buffer.begin(), buffer.begin() + len);
} }
std::u16string UTF16StringFromFixedZeroTerminatedBuffer(std::u16string_view buffer, std::u16string UTF16StringFromFixedZeroTerminatedBuffer(std::u16string_view buffer,
std::size_t max_len) { std::size_t max_len) {
std::size_t len = 0; std::size_t len = 0;
while (len < max_len && buffer[len] != '\0') while (len < buffer.length() && len < max_len && buffer[len] != '\0') {
++len; ++len;
}
return std::u16string(buffer.begin(), buffer.begin() + len); return std::u16string(buffer.begin(), buffer.begin() + len);
} }

View file

@ -63,7 +63,7 @@ template <typename InIt>
* Creates a std::string from a fixed-size NUL-terminated char buffer. If the buffer isn't * Creates a std::string from a fixed-size NUL-terminated char buffer. If the buffer isn't
* NUL-terminated then the string ends at max_len characters. * NUL-terminated then the string ends at max_len characters.
*/ */
[[nodiscard]] std::string StringFromFixedZeroTerminatedBuffer(const char* buffer, [[nodiscard]] std::string StringFromFixedZeroTerminatedBuffer(std::string_view buffer,
std::size_t max_len); std::size_t max_len);
/** /**