1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Check for NUL characters in string parsing functions.

This commit is contained in:
Lukas Tenbrink
2025-09-16 10:48:44 +02:00
parent 99a39ce6ea
commit 0d700e53f3

View File

@@ -155,7 +155,13 @@ void String::append_latin1(const Span<char> &p_cstr) {
for (; src < end; ++src, ++dst) {
// If char is int8_t, a set sign bit will be reinterpreted as 256 - val implicitly.
*dst = static_cast<uint8_t>(*src);
if (unlikely(*src == '\0')) {
// NUL in string is allowed by the unicode standard, but unsupported in our implementation right now.
print_unicode_error("Unexpected NUL character", true);
*dst = _replacement_char;
} else {
*dst = static_cast<uint8_t>(*src);
}
}
*dst = 0;
}
@@ -174,17 +180,19 @@ void String::append_utf32(const Span<char32_t> &p_cstr) {
// Copy the string, and check for UTF-32 problems.
for (; src < end; ++src, ++dst) {
const char32_t chr = *src;
if ((chr & 0xfffff800) == 0xd800) {
if (unlikely(chr == U'\0')) {
// NUL in string is allowed by the unicode standard, but unsupported in our implementation right now.
print_unicode_error("Unexpected NUL character", true);
*dst = _replacement_char;
} else if (unlikely((chr & 0xfffff800) == 0xd800)) {
print_unicode_error(vformat("Unpaired surrogate (%x)", (uint32_t)chr), true);
*dst = _replacement_char;
continue;
}
if (chr > 0x10ffff) {
} else if (unlikely(chr > 0x10ffff)) {
print_unicode_error(vformat("Invalid unicode codepoint (%x)", (uint32_t)chr), true);
*dst = _replacement_char;
continue;
} else {
*dst = chr;
}
*dst = chr;
}
*dst = 0;
}
@@ -1737,7 +1745,11 @@ Error String::append_ascii(const Span<char> &p_range) {
for (; src < end; ++src, ++dst) {
// If char is int8_t, a set sign bit will be reinterpreted as 256 - val implicitly.
const uint8_t chr = *src;
if (chr > 127) {
if (unlikely(chr == '\0')) {
// NUL in string is allowed by the unicode standard, but unsupported in our implementation right now.
print_unicode_error("Unexpected NUL character", true);
*dst = _replacement_char;
} else if (unlikely(chr > 127)) {
print_unicode_error(vformat("Invalid ASCII codepoint (%x)", (uint32_t)chr), true);
decode_failed = true;
*dst = _replacement_char;