diff options
-rw-r--r-- | indra/llcommon/llstring.cpp | 54 | ||||
-rw-r--r-- | indra/llcommon/llstring.h | 40 | ||||
-rw-r--r-- | indra/llinventory/llparcel.cpp | 6 | ||||
-rw-r--r-- | indra/llmessage/llcachename.cpp | 2 |
4 files changed, 42 insertions, 60 deletions
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 7a97830343..1f653c159c 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -663,7 +663,8 @@ S32 LLStringOps::collate(const llwchar* a, const llwchar* b) namespace LLStringFn { - void replace_nonprintable(std::basic_string<char>& string, char replacement) + // NOTE - this restricts output to ascii + void replace_nonprintable_in_ascii(std::basic_string<char>& string, char replacement) { const char MIN = 0x20; std::basic_string<char>::size_type len = string.size(); @@ -676,23 +677,9 @@ namespace LLStringFn } } - void replace_nonprintable( - std::basic_string<llwchar>& string, - llwchar replacement) - { - const llwchar MIN = 0x20; - const llwchar MAX = 0x7f; - std::basic_string<llwchar>::size_type len = string.size(); - for(std::basic_string<llwchar>::size_type ii = 0; ii < len; ++ii) - { - if((string[ii] < MIN) || (string[ii] > MAX)) - { - string[ii] = replacement; - } - } - } - void replace_nonprintable_and_pipe(std::basic_string<char>& str, + // NOTE - this restricts output to ascii + void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str, char replacement) { const char MIN = 0x20; @@ -707,22 +694,6 @@ namespace LLStringFn } } - void replace_nonprintable_and_pipe(std::basic_string<llwchar>& str, - llwchar replacement) - { - const llwchar MIN = 0x20; - const llwchar MAX = 0x7f; - const llwchar PIPE = 0x7c; - std::basic_string<llwchar>::size_type len = str.size(); - for(std::basic_string<llwchar>::size_type ii = 0; ii < len; ++ii) - { - if( (str[ii] < MIN) || (str[ii] > MAX) || (str[ii] == PIPE) ) - { - str[ii] = replacement; - } - } - } - // https://wiki.lindenlab.com/wiki/Unicode_Guidelines has details on // allowable code points for XML. Specifically, they are: // 0x09, 0x0a, 0x0d, and 0x20 on up. JC @@ -748,6 +719,23 @@ namespace LLStringFn return output; } + /** + * @brief Replace all control characters (c < 0x20) with replacement in + * string. + */ + void replace_ascii_controlchars(std::basic_string<char>& string, char replacement) + { + const unsigned char MIN = 0x20; + std::basic_string<char>::size_type len = string.size(); + for(std::basic_string<char>::size_type ii = 0; ii < len; ++ii) + { + const unsigned char c = (unsigned char) string[ii]; + if(c < MIN) + { + string[ii] = replacement; + } + } + } } diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 4b62fbe70e..8f6626b501 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -487,48 +487,29 @@ namespace LLStringFn /** * @brief Replace all non-printable characters with replacement in * string. + * NOTE - this will zap non-ascii * * @param [in,out] string the to modify. out value is the string * with zero non-printable characters. * @param The replacement character. use LL_UNKNOWN_CHAR if unsure. */ - void replace_nonprintable( + void replace_nonprintable_in_ascii( std::basic_string<char>& string, char replacement); - /** - * @brief Replace all non-printable characters with replacement in - * a wide string. - * - * @param [in,out] string the to modify. out value is the string - * with zero non-printable characters. - * @param The replacement character. use LL_UNKNOWN_CHAR if unsure. - */ - void replace_nonprintable( - std::basic_string<llwchar>& string, - llwchar replacement); /** * @brief Replace all non-printable characters and pipe characters * with replacement in a string. + * NOTE - this will zap non-ascii * * @param [in,out] the string to modify. out value is the string * with zero non-printable characters and zero pipe characters. * @param The replacement character. use LL_UNKNOWN_CHAR if unsure. */ - void replace_nonprintable_and_pipe(std::basic_string<char>& str, + void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str, char replacement); - /** - * @brief Replace all non-printable characters and pipe characters - * with replacement in a wide string. - * - * @param [in,out] the string to modify. out value is the string - * with zero non-printable characters and zero pipe characters. - * @param The replacement wide character. use LL_UNKNOWN_CHAR if unsure. - */ - void replace_nonprintable_and_pipe(std::basic_string<llwchar>& str, - llwchar replacement); /** * @brief Remove all characters that are not allowed in XML 1.0. @@ -536,6 +517,19 @@ namespace LLStringFn * Works with US ASCII and UTF-8 encoded strings. JC */ std::string strip_invalid_xml(const std::string& input); + + + /** + * @brief Replace all control characters (0 <= c < 0x20) with replacement in + * string. This is safe for utf-8 + * + * @param [in,out] string the to modify. out value is the string + * with zero non-printable characters. + * @param The replacement character. use LL_UNKNOWN_CHAR if unsure. + */ + void replace_ascii_controlchars( + std::basic_string<char>& string, + char replacement); } //////////////////////////////////////////////////////////// diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index bbf3f4af3b..6fa5c9076e 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -278,7 +278,7 @@ void LLParcel::setName(const std::string& name) // The escaping here must match the escaping in the database // abstraction layer. mName = name; - LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR); + LLStringFn::replace_nonprintable_in_ascii(mName, LL_UNKNOWN_CHAR); } void LLParcel::setDesc(const std::string& desc) @@ -296,7 +296,7 @@ void LLParcel::setMusicURL(const std::string& url) // abstraction layer. // This should really filter the url in some way. Other than // simply requiring non-printable. - LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR); + LLStringFn::replace_nonprintable_in_ascii(mMusicURL, LL_UNKNOWN_CHAR); } void LLParcel::setMediaURL(const std::string& url) @@ -306,7 +306,7 @@ void LLParcel::setMediaURL(const std::string& url) // abstraction layer if it's ever added. // This should really filter the url in some way. Other than // simply requiring non-printable. - LLStringFn::replace_nonprintable(mMediaURL, LL_UNKNOWN_CHAR); + LLStringFn::replace_nonprintable_in_ascii(mMediaURL, LL_UNKNOWN_CHAR); } void LLParcel::setMediaDesc(const std::string& desc) diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 21c0e579ac..776f2b1535 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -894,7 +894,7 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup) else { // is group msg->getStringFast(_PREHASH_UUIDNameBlock, _PREHASH_GroupName, entry->mGroupName, i); - LLStringFn::replace_nonprintable(entry->mGroupName, LL_UNKNOWN_CHAR); + LLStringFn::replace_ascii_controlchars(entry->mGroupName, LL_UNKNOWN_CHAR); } if (!isGroup) |