diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
index 523f9fc4d0..44c12a2b4c 100644
--- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
+++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
@@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using log4net;
@@ -74,6 +75,12 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
RegionInfo[] regionsToLoad = regionLoader.LoadRegions();
openSim.ModuleLoader.LoadDefaultSharedModules();
+
+ if (!CheckRegionsForSanity(regionsToLoad))
+ {
+ m_log.Error("[LOADREGIONS]: Halting startup due to conflicts in region configurations");
+ System.Environment.Exit(1);
+ }
for (int i = 0; i < regionsToLoad.Length; i++)
{
@@ -88,10 +95,56 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
public void Dispose()
{
- }
+ }
#endregion
-
+
+ ///
+ /// Check that region configuration information makes sense.
+ ///
+ ///
+ /// True if we're sane, false if we're insane
+ private bool CheckRegionsForSanity(RegionInfo[] regions)
+ {
+ if (regions.Length <= 0)
+ return true;
+
+ List checkedRegions = new List();
+ checkedRegions.Add(regions[0]);
+
+ for (int i = 1; i < regions.Length; i++)
+ {
+ RegionInfo region = regions[i];
+
+ foreach (RegionInfo checkedRegion in checkedRegions)
+ {
+ if (region.RegionID == checkedRegion.RegionID)
+ {
+ m_log.ErrorFormat(
+ "[LOADREGIONS]: Regions {0} and {1} have the same UUID {2}",
+ region.RegionName, checkedRegion.RegionName, region.RegionID);
+ return false;
+ }
+ else if (region.RegionLocX == checkedRegion.RegionLocX && region.RegionLocY == checkedRegion.RegionLocY)
+ {
+ m_log.ErrorFormat(
+ "[LOADREGIONS]: Regions {0} and {1} have the same location {2} {3}",
+ region.RegionName, checkedRegion.RegionName, region.RegionLocX, region.RegionLocY);
+ return false;
+ }
+ else if (region.InternalEndPoint.Port == checkedRegion.InternalEndPoint.Port)
+ {
+ m_log.ErrorFormat(
+ "[LOADREGIONS]: Regions {0} and {1} have the same internal IP port {2}",
+ region.RegionName, checkedRegion.RegionName, region.InternalEndPoint.Port);
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
public void LoadRegionFromConfig(OpenSimBase openSim, ulong regionhandle)
{
m_log.Info("[LOADREGIONS]: Load Regions addin being initialised");
diff --git a/OpenSim/Data/MySQL/MySQLUserData.cs b/OpenSim/Data/MySQL/MySQLUserData.cs
index 627bc0cf8d..1ae5645f9e 100644
--- a/OpenSim/Data/MySQL/MySQLUserData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserData.cs
@@ -409,6 +409,7 @@ namespace OpenSim.Data.MySQL
Lfli.Add(fli);
}
+
reader.Dispose();
result.Dispose();
}