From d15a3cf34425bd827a34858e997784ed9496f9b7 Mon Sep 17 00:00:00 2001 From: DemonWav Date: Sat, 26 Mar 2016 21:36:05 -0500 Subject: [PATCH] Prevent possible infinite loop in BlockPosition iterator diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java index 2d56f02..b87c4c6 100644 --- a/src/main/java/net/minecraft/server/BlockPosition.java +++ b/src/main/java/net/minecraft/server/BlockPosition.java @@ -139,15 +139,17 @@ public class BlockPosition extends BaseBlockPosition { protected BlockPosition a() { if (this.b == null) { - this.b = blockposition; + this.b = blockposition2; // Paper - use blockposition2 instead of blockposition to prevent infinite loops return this.b; - } else if (this.b.equals(blockposition1)) { + } else if (this.b.equals(blockposition3)) { // Paper - use blockposition3 instead of blockposition1 to prevent infinite loops return (BlockPosition) this.endOfData(); } else { int i = this.b.getX(); int j = this.b.getY(); int k = this.b.getZ(); + // Paper start - use blockposition2 and blockposition3 to prevent infinite loops + /* if (i < blockposition1.getX()) { ++i; } else if (j < blockposition1.getY()) { @@ -158,6 +160,18 @@ public class BlockPosition extends BaseBlockPosition { j = blockposition.getY(); ++k; } + */ + if (i < blockposition3.getX()) { + ++i; + } else if (j < blockposition3.getY()) { + i = blockposition2.getX(); + ++j; + } else if (k < blockposition3.getZ()) { + i = blockposition2.getX(); + j = blockposition2.getY(); + ++k; + } + // Paper end this.b = new BlockPosition(i, j, k); return this.b; @@ -187,15 +201,17 @@ public class BlockPosition extends BaseBlockPosition { protected BlockPosition.MutableBlockPosition a() { if (this.b == null) { - this.b = new BlockPosition.MutableBlockPosition(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + this.b = new BlockPosition.MutableBlockPosition(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); // Paper - use blockposition2 instead of blockposition to prevent infinite loops return this.b; - } else if (this.b.equals(blockposition1)) { + } else if (this.b.equals(blockposition3)) { // Paper - use blockposition3 instead of blockposition1 to prevent infinite loops return (BlockPosition.MutableBlockPosition) this.endOfData(); } else { int i = this.b.getX(); int j = this.b.getY(); int k = this.b.getZ(); + // Paper start - use blockposition2 and blockposition3 to prevent infinite loops + /* if (i < blockposition1.getX()) { ++i; } else if (j < blockposition1.getY()) { @@ -206,6 +222,18 @@ public class BlockPosition extends BaseBlockPosition { j = blockposition.getY(); ++k; } + */ + if (i < blockposition3.getX()) { + ++i; + } else if (j < blockposition3.getY()) { + i = blockposition2.getX(); + ++j; + } else if (k < blockposition3.getZ()) { + i = blockposition2.getX(); + j = blockposition2.getY(); + ++k; + } + // Paper end // Paper start - modify base position variables ((BaseBlockPosition) this.b).a = i; -- 2.8.0