From f1380f2fc3eecd8dfd2f75d053ff86716d5055f7 Mon Sep 17 00:00:00 2001
From: Robert Knop <prospero@lindenlab.com>
Date: Mon, 19 Jan 2009 20:40:59 +0000
Subject: [PATCH] Merging from the server/server-1.25 branch

svn merge -r107352:108210
svn+ssh://svn.lindenlab.com/svn/linden/branches/server/server-1.25

Merge conflicts were resolved:

  scripts/start-server   : one conflict, kept the "working" version

  indra/llcommon/llversionserver.h : reverted
  indra/newview/Info-SecondLife.plist : reverted
  indra/newview/res/viewerRes.rc : reverted

  indra/newsim/llagentinfo.cpp : kept *both*... "working" had
      is_agent_online, which nothing else had, and the merge had
      isGodAllowed(), part of SEC resolution

  indra/backbone/agent_router.py : kartic & rdw merged and reviewed
      using brains and things

  indra/newsim/llsimhttpresponder.cpp : doesn't exist in trunk, and
      that's OK (even though there was a change for it)
---
 indra/llcommon/llstring.cpp     | 54 +++++++++++++--------------------
 indra/llcommon/llstring.h       | 40 +++++++++++-------------
 indra/llinventory/llparcel.cpp  |  6 ++--
 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 7a978303431..1f653c159c8 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 4b62fbe70eb..8f6626b501d 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 bbf3f4af3bb..6fa5c9076ef 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 21c0e579acd..776f2b15358 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)
-- 
GitLab