Merge pull request #86827 from bruvzg/ploc_out_of_bounds

[Pseudolocalization] Prevent out of bounds reads.
This commit is contained in:
Rémi Verschelde 2024-01-08 11:57:55 +01:00
commit 9bacd02297
No known key found for this signature in database
GPG key ID: C3336907360768E1

View file

@ -881,7 +881,7 @@ StringName TranslationServer::tool_pseudolocalize(const StringName &p_message) c
String TranslationServer::get_override_string(String &p_message) const { String TranslationServer::get_override_string(String &p_message) const {
String res; String res;
for (int i = 0; i < p_message.size(); i++) { for (int i = 0; i < p_message.length(); i++) {
if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) { if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) {
res += p_message[i]; res += p_message[i];
res += p_message[i + 1]; res += p_message[i + 1];
@ -895,7 +895,7 @@ String TranslationServer::get_override_string(String &p_message) const {
String TranslationServer::double_vowels(String &p_message) const { String TranslationServer::double_vowels(String &p_message) const {
String res; String res;
for (int i = 0; i < p_message.size(); i++) { for (int i = 0; i < p_message.length(); i++) {
if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) { if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) {
res += p_message[i]; res += p_message[i];
res += p_message[i + 1]; res += p_message[i + 1];
@ -913,7 +913,7 @@ String TranslationServer::double_vowels(String &p_message) const {
String TranslationServer::replace_with_accented_string(String &p_message) const { String TranslationServer::replace_with_accented_string(String &p_message) const {
String res; String res;
for (int i = 0; i < p_message.size(); i++) { for (int i = 0; i < p_message.length(); i++) {
if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) { if (pseudolocalization_skip_placeholders_enabled && is_placeholder(p_message, i)) {
res += p_message[i]; res += p_message[i];
res += p_message[i + 1]; res += p_message[i + 1];
@ -936,7 +936,7 @@ String TranslationServer::wrap_with_fakebidi_characters(String &p_message) const
char32_t fakebidisuffix = U'\u202c'; char32_t fakebidisuffix = U'\u202c';
res += fakebidiprefix; res += fakebidiprefix;
// The fake bidi unicode gets popped at every newline so pushing it back at every newline. // The fake bidi unicode gets popped at every newline so pushing it back at every newline.
for (int i = 0; i < p_message.size(); i++) { for (int i = 0; i < p_message.length(); i++) {
if (p_message[i] == '\n') { if (p_message[i] == '\n') {
res += fakebidisuffix; res += fakebidisuffix;
res += p_message[i]; res += p_message[i];
@ -978,7 +978,7 @@ const char32_t *TranslationServer::get_accented_version(char32_t p_character) co
} }
bool TranslationServer::is_placeholder(String &p_message, int p_index) const { bool TranslationServer::is_placeholder(String &p_message, int p_index) const {
return p_index < p_message.size() - 1 && p_message[p_index] == '%' && return p_index < p_message.length() - 1 && p_message[p_index] == '%' &&
(p_message[p_index + 1] == 's' || p_message[p_index + 1] == 'c' || p_message[p_index + 1] == 'd' || (p_message[p_index + 1] == 's' || p_message[p_index + 1] == 'c' || p_message[p_index + 1] == 'd' ||
p_message[p_index + 1] == 'o' || p_message[p_index + 1] == 'x' || p_message[p_index + 1] == 'X' || p_message[p_index + 1] == 'f'); p_message[p_index + 1] == 'o' || p_message[p_index + 1] == 'x' || p_message[p_index + 1] == 'X' || p_message[p_index + 1] == 'f');
} }