Browse Source

Fix undefined behavior in `String::operator+=(const String &)`

kleonc 3 years ago
parent
commit
1324ca5eb0
1 changed files with 4 additions and 2 deletions
  1. 4 2
      core/string/ustring.cpp

+ 4 - 2
core/string/ustring.cpp

@@ -531,10 +531,12 @@ String &String::operator+=(const String &p_str) {
 
 
 	resize(lhs_len + rhs_len + 1);
 	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;
 	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;
 	return *this;
 }
 }