From 9944748cbf856fac244248784222a80156447695 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Fri, 16 Jul 2021 17:56:55 +0200
Subject: [PATCH] Fixed a bug that could cause a crash when going over the
 maximum linedef limit

---
 Source/Core/Geometry/Tools.cs                 |  3 ++-
 Source/Core/Map/MapSet.cs                     | 24 +++++++++++++++----
 .../ClassicModes/DrawGeometryMode.cs          |  2 --
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/Source/Core/Geometry/Tools.cs b/Source/Core/Geometry/Tools.cs
index 6253e909c..d6b888163 100755
--- a/Source/Core/Geometry/Tools.cs
+++ b/Source/Core/Geometry/Tools.cs
@@ -1400,7 +1400,8 @@ namespace CodeImp.DoomBuilder.Geometry
 				// Before this point, the new geometry is not linked with the existing geometry.
 				// Now perform standard geometry stitching to merge the new geometry with the rest
 				// of the map. The marked vertices indicate the new geometry.
-				map.StitchGeometry();
+				if (!map.StitchGeometry())
+					return false;
 				map.Update(true, false);
 
 				// Find our new lines again, because they have been merged with the other geometry
diff --git a/Source/Core/Map/MapSet.cs b/Source/Core/Map/MapSet.cs
index 1b37ec71b..62213815d 100755
--- a/Source/Core/Map/MapSet.cs
+++ b/Source/Core/Map/MapSet.cs
@@ -2129,22 +2129,36 @@ namespace CodeImp.DoomBuilder.Map
 			
 			// Split moving lines with unselected vertices
 			ICollection<Vertex> nearbyfixedverts = FilterByArea(fixedverts, ref editarea);
-			if(!SplitLinesByVertices(movinglines, nearbyfixedverts, STITCH_DISTANCE, movinglines, mergemode))
+			if (!SplitLinesByVertices(movinglines, nearbyfixedverts, STITCH_DISTANCE, movinglines, mergemode))
+			{
+				EndAddRemove(); // Unfreeze arrays before returning
 				return false;
+			}
 
             // Split non-moving lines with selected vertices
             fixedlines = new HashSet<Linedef>(fixedlines.Where(fixedline => !fixedline.IsDisposed));
-			if(!SplitLinesByVertices(fixedlines, movingverts, STITCH_DISTANCE, movinglines, mergemode))
+			if (!SplitLinesByVertices(fixedlines, movingverts, STITCH_DISTANCE, movinglines, mergemode))
+			{
+				EndAddRemove(); // Unfreeze arrays before returning
 				return false;
+			}
 
 			//mxd. Split moving lines with fixed lines
-			if(!SplitLinesByLines(fixedlines, movinglines, mergemode)) return false;
+			if (!SplitLinesByLines(fixedlines, movinglines, mergemode))
+			{
+				EndAddRemove(); // Unfreeze arrays before returning
+				return false;
+			}
 			
 			// Remove looped linedefs
 			RemoveLoopedLinedefs(movinglines);
-			
+
 			// Join overlapping lines
-			if(!JoinOverlappingLines(movinglines)) return false;
+			if (!JoinOverlappingLines(movinglines))
+			{
+				EndAddRemove(); // Unfreeze arrays before returning
+				return false;
+			}
 
 			//mxd. Remove remaining new verts from dragged shape if possible
 			if(mergemode == MergeGeometryMode.REPLACE)
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
index 1e16d9c6c..950c71716 100755
--- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
@@ -839,8 +839,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				else
 				{
 					// Drawing failed
-					// NOTE: I have to call this twice, because the first time only cancels this volatile mode
-					General.Map.UndoRedo.WithdrawUndo();
 					General.Map.UndoRedo.WithdrawUndo();
 				}
 			}
-- 
GitLab