From d5dbcc8ad706e6ec69790e3936abca60be1a5b71 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 5 Sep 2016 15:59:33 +0100
Subject: ubMeshmerizer: add a few more try{} guards in file operations, etc

---
 OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs | 47 ++++++++++-----------
 .../PhysicsModules/ubOdeMeshing/Meshmerizer.cs     | 49 ++++++++++++----------
 2 files changed, 50 insertions(+), 46 deletions(-)

diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
index 5b1510f..d9ea4a4 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs
@@ -588,38 +588,37 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
             Mesh mesh = new Mesh();
             mesh.releaseBuildingMeshData();
 
-            BinaryReader br = new BinaryReader(st);
-
             bool ok = true;
-            try
+            using(BinaryReader br = new BinaryReader(st))
             {
-                mesh.m_vertexCount = br.ReadInt32();
-                mesh.m_indexCount = br.ReadInt32();
+                try
+                {
+                    mesh.m_vertexCount = br.ReadInt32();
+                    mesh.m_indexCount = br.ReadInt32();
 
-                int n = 3 * mesh.m_vertexCount;
-                mesh.vertices = new float[n];
-                for (int i = 0; i < n; i++)
-                    mesh.vertices[i] = br.ReadSingle();
+                    int n = 3 * mesh.m_vertexCount;
+                    mesh.vertices = new float[n];
+                    for (int i = 0; i < n; i++)
+                        mesh.vertices[i] = br.ReadSingle();
 
-                mesh.indexes = new int[mesh.m_indexCount];
-                for (int i = 0; i < mesh.m_indexCount; i++)
-                    mesh.indexes[i] = br.ReadInt32();
+                    mesh.indexes = new int[mesh.m_indexCount];
+                    for (int i = 0; i < mesh.m_indexCount; i++)
+                        mesh.indexes[i] = br.ReadInt32();
 
-                mesh.m_obb.X = br.ReadSingle();
-                mesh.m_obb.Y = br.ReadSingle();
-                mesh.m_obb.Z = br.ReadSingle();
+                    mesh.m_obb.X = br.ReadSingle();
+                    mesh.m_obb.Y = br.ReadSingle();
+                    mesh.m_obb.Z = br.ReadSingle();
 
-                mesh.m_obboffset.X = br.ReadSingle();
-                mesh.m_obboffset.Y = br.ReadSingle();
-                mesh.m_obboffset.Z = br.ReadSingle();
-            }
-            catch
-            {
-                ok = false;
+                    mesh.m_obboffset.X = br.ReadSingle();
+                    mesh.m_obboffset.Y = br.ReadSingle();
+                    mesh.m_obboffset.Z = br.ReadSingle();
+                }
+                catch
+                {
+                    ok = false;
+                }
             }
 
-            br.Close();
-
             if (ok)
             {
                 mesh.pinMemory();
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
index d9544db..ff10e7f 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
@@ -60,7 +60,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
 
 		private bool m_Enabled = false;
 		
-        public object diskLock = new object();
+        public static object diskLock = new object();
 
         public bool doMeshFileCache = true;
 
@@ -1426,13 +1426,13 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
             {
                 if (File.Exists(filename))
                 {
-                    FileStream stream = null;
                     try
                     {
-                        stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
-                        BinaryFormatter bformatter = new BinaryFormatter();
-
-                        mesh = Mesh.FromStream(stream, key);
+                        using(FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
+                        {
+//                            BinaryFormatter bformatter = new BinaryFormatter();
+                            mesh = Mesh.FromStream(stream,key);
+                        }
                         
                     }
                     catch (Exception e)
@@ -1443,13 +1443,17 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
                             filename, e.Message, e.StackTrace);
                     }
 
-                    if (stream != null)
-                        stream.Close();
+                    try
+                    {
+                        if (mesh == null || !ok)
+                            File.Delete(filename);
+                        else
+                            File.SetLastAccessTimeUtc(filename, DateTime.UtcNow);
+                    }
+                    catch
+                    {
+                    }
 
-                    if (mesh == null || !ok)
-                        File.Delete(filename);
-                    else
-                        File.SetLastAccessTimeUtc(filename, DateTime.UtcNow);
                 }
             }
 
@@ -1458,7 +1462,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
 
         private void StoreToFileCache(AMeshKey key, Mesh mesh)
         {
-            Stream stream = null;
             bool ok = false;
 
             // Make sure the target cache directory exists
@@ -1476,8 +1479,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
                         Directory.CreateDirectory(dir);
                     }
 
-                    stream = File.Open(filename, FileMode.Create);
-                    ok = mesh.ToStream(stream);
+                    using(Stream stream = File.Open(filename, FileMode.Create))
+                        ok = mesh.ToStream(stream);
                 }
                 catch (IOException e)
                 {
@@ -1487,15 +1490,17 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
                     ok = false;
                 }
 
-                if (stream != null)
-                    stream.Close();
-
-                if (File.Exists(filename))
+                if (!ok && File.Exists(filename))
                 {
-                    if (ok)
-                        File.SetLastAccessTimeUtc(filename, DateTime.UtcNow);
-                    else
+                    try
+                    {
                         File.Delete(filename);
+                    }
+                    catch (IOException e)
+                    {
+                         m_log.ErrorFormat(
+                        "[MESH CACHE]: Failed to delete file {0}",filename);
+                    }
                 }
             }
         }
-- 
cgit v1.1