Strengthen entity list guard patch back up to its original level. Whilst upstream fixes attempt to fix this, they aren't fully functional and can cause the server to crash. This way we can both identify bad plugins and stop all crashes.

By: md_5 <git@md-5.net>
This commit is contained in:
Spigot
2014-03-10 09:04:25 +11:00
parent 75687b16c6
commit 74b65b1d0e
2 changed files with 95 additions and 28 deletions

View File

@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/m
index 6ec7f5a..9bc4256 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -29,7 +29,25 @@ import org.bukkit.event.weather.ThunderChangeEvent;
@@ -29,7 +29,25 @@ import java.util.concurrent.Callable;
public abstract class World implements IBlockAccess {
public boolean d;
@@ -35,51 +35,39 @@ index 6ec7f5a..9bc4256 100644
protected List f = new ArrayList();
public Set tileEntityList = new HashSet(); // CraftBukkit - ArrayList -> HashSet
private List a = new ArrayList();
@@ -78,6 +96,7 @@ public abstract class World implements IBlockAccess {
int[] I;
@@ -74,6 +92,7 @@ public abstract class World implements IBlockAccess {
int[] H;
public boolean isStatic;
// Spigot start
+ private boolean guardEntityList = false;
+ private boolean guardEntityList;
protected final gnu.trove.map.hash.TLongShortHashMap chunkTickList;
protected float growthOdds = 100;
protected float modifiedOdds = 100;
@@ -1033,7 +1052,12 @@ public abstract class World implements IBlockAccess {
if (index <= this.tickPosition) {
this.tickPosition--;
}
+ // Spigot start
+ boolean isGuarding = guardEntityList;
+ guardEntityList = false;
this.entityList.remove(index);
+ guardEntityList = isGuarding;
+ // Spigot end
}
// CraftBukkit end
@@ -1272,6 +1296,7 @@ public abstract class World implements IBlockAccess {
@@ -1285,6 +1304,7 @@ public abstract class World implements IBlockAccess {
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
timings.entityTick.startTiming(); // Spigot
+ guardEntityList = true; // Spigot
// CraftBukkit start - Use field for loop variable
for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) {
entity = (Entity) this.entityList.get(this.tickPosition);
@@ -1320,12 +1345,15 @@ public abstract class World implements IBlockAccess {
for (i = 0; i < this.entityList.size(); ++i) {
entity = (Entity) this.entityList.get(i);
@@ -1331,14 +1351,16 @@ public abstract class World implements IBlockAccess {
if (entity.ai && this.isChunkLoaded(j, k)) {
this.getChunkAt(j, k).b(entity);
}
-
+ guardEntityList = false; // Spigot
this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable
this.entityList.remove(i--);
+ guardEntityList = true; // Spigot
this.b(entity);
}
this.methodProfiler.b();
}
lastChunk = Long.MIN_VALUE; // Spigot
+ guardEntityList = false; // Spigot
timings.entityTick.stopTiming(); // Spigot
this.methodProfiler.c("blockEntities");
this.methodProfiler.c("tileEntities");
--
1.8.3.2
1.8.1.msysgit.1