diff options
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/llstring.cpp | 17 | ||||
| -rwxr-xr-x | indra/llcommon/llstring.h | 1 | ||||
| -rwxr-xr-x | indra/llcommon/lluri.cpp | 29 | 
3 files changed, 42 insertions, 5 deletions
| diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 0c32679744..22c8681983 100755 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -52,6 +52,23 @@ std::string ll_safe_string(const char* in, S32 maxlen)  	return std::string();  } +bool is_char_hex(char hex) +{ +	if((hex >= '0') && (hex <= '9')) +	{ +		return true; +	} +	else if((hex >= 'a') && (hex <='f')) +	{ +		return true; +	} +	else if((hex >= 'A') && (hex <='F')) +	{ +		return true; +	} +	return false; // uh - oh, not hex any more... +} +  U8 hex_as_nybble(char hex)  {  	if((hex >= '0') && (hex <= '9')) diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 119efc7957..f9702868c8 100755 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -470,6 +470,7 @@ inline std::string chop_tail_copy(   * @brief This translates a nybble stored as a hex value from 0-f back   * to a nybble in the low order bits of the return byte.   */ +LL_COMMON_API bool is_char_hex(char hex);  LL_COMMON_API U8 hex_as_nybble(char hex);  /** diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 21456a599b..37f5b3d6a3 100755 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -129,11 +129,30 @@ std::string LLURI::unescape(const std::string& str)  		{  			++it;  			if(it == end) break; -			U8 c = hex_as_nybble(*it++); -			c = c << 4; -			if (it == end) break; -			c |= hex_as_nybble(*it); -			ostr.put((char)c); + +			if(is_char_hex(*it)) +			{ +				U8 c = hex_as_nybble(*it++); + +				c = c << 4; +				if (it == end) break; + +				if(is_char_hex(*it)) +				{ +					c |= hex_as_nybble(*it); +					ostr.put((char)c); +				} +				else +				{ +					ostr.put((char)c); +					ostr.put(*it); +				} +			} +			else +			{ +				ostr.put('%'); +				ostr.put(*it); +			}  		}  		else  		{ | 
