summaryrefslogtreecommitdiff
path: root/core/string
diff options
context:
space:
mode:
authorkleonc <9283098+kleonc@users.noreply.github.com>2022-08-18 14:24:14 +0200
committerkleonc <9283098+kleonc@users.noreply.github.com>2022-08-18 14:57:24 +0200
commit1324ca5eb050334b2ad2640ed2256bd71bd54bbd (patch)
tree83dbfc5e8cd7cea2a4629f535e33fd241278837e /core/string
parent03dc8c5d6fc4a1cc8c0b8b329ae53a3d0d8b3074 (diff)
Fix undefined behavior in `String::operator+=(const String &)`
Diffstat (limited to 'core/string')
-rw-r--r--core/string/ustring.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp
index e93375bff7..13be7516d5 100644
--- a/core/string/ustring.cpp
+++ b/core/string/ustring.cpp
@@ -531,10 +531,12 @@ String &String::operator+=(const String &p_str) {
resize(lhs_len + rhs_len + 1);
- const char32_t *src = p_str.get_data();
+ const char32_t *src = p_str.ptr();
char32_t *dst = ptrw() + lhs_len;
- memcpy(dst, src, (rhs_len + 1) * sizeof(char32_t));
+ // Don't copy the terminating null with `memcpy` to avoid undefined behavior when string is being added to itself (it would overlap the destination).
+ memcpy(dst, src, rhs_len * sizeof(char32_t));
+ *(dst + rhs_len) = _null;
return *this;
}