From b383cdae339631d009a07cde4f10fcd3d61d9e77 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 28 Oct 2015 21:27:56 +0000
Subject: fix cut points of UTF-8 strings
---
OpenSim/Framework/Util.cs | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index a5f798d..1f74168 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -1818,17 +1818,26 @@ namespace OpenSim.Framework
///
public static byte[] StringToBytes256(string str)
{
- if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; }
- if (str.Length > 254) str = str.Remove(254);
- if (!str.EndsWith("\0")) { str += "\0"; }
+ if (String.IsNullOrEmpty(str))
+ return Utils.EmptyBytes;
+
+ if (!str.EndsWith("\0"))
+ str += "\0";
// Because this is UTF-8 encoding and not ASCII, it's possible we
// might have gotten an oversized array even after the string trim
byte[] data = UTF8.GetBytes(str);
+
if (data.Length > 256)
{
- Array.Resize(ref data, 256);
- data[255] = 0;
+ int cut = 255;
+ if((data[cut] & 0x80 ) != 0 )
+ {
+ while(cut > 0 && (data[cut] & 0xc0) != 0xc0)
+ cut--;
+ }
+ Array.Resize(ref data, cut + 1);
+ data[cut] = 0;
}
return data;
@@ -1860,17 +1869,26 @@ namespace OpenSim.Framework
///
public static byte[] StringToBytes1024(string str)
{
- if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; }
- if (str.Length > 1023) str = str.Remove(1023);
- if (!str.EndsWith("\0")) { str += "\0"; }
+ if (String.IsNullOrEmpty(str))
+ return Utils.EmptyBytes;
+
+ if (!str.EndsWith("\0"))
+ str += "\0";
// Because this is UTF-8 encoding and not ASCII, it's possible we
// might have gotten an oversized array even after the string trim
byte[] data = UTF8.GetBytes(str);
+
if (data.Length > 1024)
{
- Array.Resize(ref data, 1024);
- data[1023] = 0;
+ int cut = 1023;
+ if((data[cut] & 0x80 ) != 0 )
+ {
+ while(cut > 0 && (data[cut] & 0xc0) != 0xc0)
+ cut--;
+ }
+ Array.Resize(ref data, cut + 1);
+ data[cut] = 0;
}
return data;
--
cgit v1.1
From bcb27d44062c478508f1cd5d211d204b2f151e8a Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Sun, 15 Nov 2015 08:16:52 +0000
Subject: fix the protection for more Wearables than region suports
---
OpenSim/Framework/AvatarAppearance.cs | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index f442fc2..e1725a9 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -458,11 +458,11 @@ namespace OpenSim.Framework
// m_log.WarnFormat("[AVATARAPPEARANCE] set wearable {0} --> {1}:{2}",wearableId,wearable.ItemID,wearable.AssetID);
// DEBUG OFF
m_wearables[wearableId].Clear();
- int count = wearable.Count;
- if (count > AvatarWearable.MAX_WEARABLES)
- count = AvatarWearable.MAX_WEARABLES;
- for (int i = 0; i < count; i++)
- m_wearables[wearableId].Add(wearable[i].ItemID, wearable[i].AssetID);
+ int count = wearable.Count;
+ if (count > AvatarWearable.MAX_WEARABLES)
+ count = AvatarWearable.MAX_WEARABLES;
+ for (int i = 0; i < count; i++)
+ m_wearables[wearableId].Add(wearable[i].ItemID, wearable[i].AssetID);
}
// DEBUG ON
@@ -760,7 +760,10 @@ namespace OpenSim.Framework
if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array)
{
OSDArray wears = (OSDArray)(data["wearables"]);
- for (int i = 0; i < wears.Count; i++)
+ int count = wears.Count;
+ if (count > AvatarWearable.MAX_WEARABLES)
+ count = AvatarWearable.MAX_WEARABLES;
+ for (int i = 0; i < count; i++)
m_wearables[i] = new AvatarWearable((OSDArray)wears[i]);
}
else
--
cgit v1.1