papermc/Spigot-Server-Patches/0101-Prevent-possible-infinite-loop-in-BlockPosition-iter.patch
Aikar 3faaaab75d Optimize isInvalidYLocation, getType and getBlockData
Some pretty micro optimizations, but this is the hottest method in the server....

This will drastically reduce number of operations to perform getType

the 2 previous patches was squashed into 1
2016-06-22 22:43:02 -04:00

91 lines
4.8 KiB
Diff

From 9fda9b975db0dc3d25ccd4b859d75bfd93ff2bea Mon Sep 17 00:00:00 2001
From: DemonWav <demonwav@gmail.com>
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 704faa9..d6cc51b 100644
--- a/src/main/java/net/minecraft/server/BlockPosition.java
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
@@ -141,15 +141,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()) {
@@ -160,6 +162,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;
@@ -189,15 +203,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()) {
@@ -208,6 +224,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.b = i;
this.b.c = j;
--
2.9.0