From 571becefb652869fa844188cadf8aca1fea774ab Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 22 Nov 2010 23:31:29 +0100
Subject: Fix some crashes caused by the addition of the CreatorData column

---
 OpenSim/Framework/Capabilities/Caps.cs                |  1 +
 OpenSim/Framework/TaskInventoryDictionary.cs          |  1 +
 .../InventoryAccess/InventoryAccessModule.cs          |  6 ++++++
 .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 19 ++++++++++++++++++-
 .../Connectors/Inventory/XInventoryConnector.cs       |  9 ++++++++-
 5 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs
index 7b0e053..e7f2e13 100644
--- a/OpenSim/Framework/Capabilities/Caps.cs
+++ b/OpenSim/Framework/Capabilities/Caps.cs
@@ -967,6 +967,7 @@ namespace OpenSim.Framework.Capabilities
             InventoryItemBase item = new InventoryItemBase();
             item.Owner = m_agentID;
             item.CreatorId = m_agentID.ToString();
+            item.CreatorData = String.Empty;
             item.ID = inventoryItem;
             item.AssetID = asset.FullID;
             item.Description = assetDescription;
diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs
index a8a53f2..940e567 100644
--- a/OpenSim/Framework/TaskInventoryDictionary.cs
+++ b/OpenSim/Framework/TaskInventoryDictionary.cs
@@ -151,6 +151,7 @@ namespace OpenSim.Framework
                 while (!m_itemLock.TryEnterWriteLock(60000))
                 {
                     m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
+                    System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
                     if (m_itemLock.IsWriteLockHeld)
                     {
                         m_itemLock = new System.Threading.ReaderWriterLockSlim();
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 2e3db48..22da665 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -436,9 +436,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
                     item = new InventoryItemBase();
                     // Can't know creator is the same, so null it in inventory
                     if (objlist.Count > 1)
+                    {
                         item.CreatorId = UUID.Zero.ToString();
+                        item.CreatorData = String.Empty;
+                    }
                     else
+                    {
                         item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
+                        item.CreatorData = objlist[0].RootPart.CreatorData;
+                    }
                     item.ID = UUID.Random();
                     item.InvType = (int)InventoryType.Object;
                     item.Folder = folder.ID;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1ba28dc..7e9224d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -10177,6 +10177,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             if (str2 == String.Empty)
                 return str1;
 
+            int len = str2.Length;
+            if ((len % 4) != 0) // LL is EVIL!!!!
+            {
+                while (str2.EndsWith("="))
+                    str2 = str2.Substring(0, str2.Length - 1);
+
+                len = str2.Length;
+                int mod = len % 4;
+
+                if (mod == 1)
+                    str2 = str2.Substring(0, str2.Length - 1);
+                else if (mod == 2)
+                    str2 += "==";
+                else if (mod == 3)
+                    str2 += "=";
+            }
+
             byte[] data1;
             byte[] data2;
             try
@@ -10200,7 +10217,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             {
                 while (pos < data1.Length)
                 {
-                    int len = data1.Length - pos;
+                    len = data1.Length - pos;
                     if (len > data2.Length)
                         len = data2.Length;
 
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
index 88fbda3..b3bfcc2 100644
--- a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
@@ -302,6 +302,8 @@ namespace OpenSim.Services.Connectors
 
         public bool AddItem(InventoryItemBase item)
         {
+            if (item.CreatorData == null)
+                item.CreatorData = String.Empty;
             Dictionary<string,object> ret = MakeRequest("ADDITEM",
                     new Dictionary<string,object> {
                         { "AssetID", item.AssetID.ToString() },
@@ -335,6 +337,8 @@ namespace OpenSim.Services.Connectors
 
         public bool UpdateItem(InventoryItemBase item)
         {
+            if (item.CreatorData == null)
+                item.CreatorData = String.Empty;
             Dictionary<string,object> ret = MakeRequest("UPDATEITEM",
                     new Dictionary<string,object> {
                         { "AssetID", item.AssetID.ToString() },
@@ -558,7 +562,10 @@ namespace OpenSim.Services.Connectors
                 item.InvType = int.Parse(data["InvType"].ToString());
                 item.Folder = new UUID(data["Folder"].ToString());
                 item.CreatorId = data["CreatorId"].ToString();
-                item.CreatorData = data["CreatorData"].ToString();
+                if (data.ContainsKey("CreatorData"))
+                    item.CreatorData = data["CreatorData"].ToString();
+                else
+                    item.CreatorData = String.Empty;
                 item.Description = data["Description"].ToString();
                 item.NextPermissions = uint.Parse(data["NextPermissions"].ToString());
                 item.CurrentPermissions = uint.Parse(data["CurrentPermissions"].ToString());
-- 
cgit v1.1