aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAikar <[email protected]>2019-02-28 00:42:40 -0500
committerAikar <[email protected]>2019-02-28 00:42:40 -0500
commit087a5e99b81efda8a0ad7c740827f0bba6032f54 (patch)
tree4a7b3c77e0ca49005931d31db42cfcfa64c68346
parent1627071d5020f70b76e6a25b574c1b3ddc6f3788 (diff)
downloadPaper-087a5e99b81efda8a0ad7c740827f0bba6032f54.tar.gz
Paper-087a5e99b81efda8a0ad7c740827f0bba6032f54.zip
Strip extra Sign data to/from client - #1876
modified clients can send abnormally large data from the client to the server and it would get stored on the sign as sent. the client can barely render around 16 characters as-is, but formatting codes can get it to be more than 16 actual length. Set a limit of 80 which should give an average of 16 characters 2 sets of legacy formatting codes which should be plenty for all uses. This does not strip any existing data from the NBT as plugins may use this for storing data out of the rendered area. it only impacts data sent to and from the client. Set -DPaper.maxSignLength=XX to change limit or -1 to disable Also fix sign edit memory leak
-rw-r--r--Spigot-Server-Patches/0374-Strip-extra-Sign-data-to-from-client.patch77
-rw-r--r--Spigot-Server-Patches/0375-Fix-sign-edit-memory-leak.patch47
2 files changed, 124 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0374-Strip-extra-Sign-data-to-from-client.patch b/Spigot-Server-Patches/0374-Strip-extra-Sign-data-to-from-client.patch
new file mode 100644
index 0000000000..22ea1f5134
--- /dev/null
+++ b/Spigot-Server-Patches/0374-Strip-extra-Sign-data-to-from-client.patch
@@ -0,0 +1,77 @@
+From 2b5bbee0eb86a2486367181c384d7040b8c52656 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Wed, 27 Feb 2019 22:18:40 -0500
+Subject: [PATCH] Strip extra Sign data to/from client
+
+modified clients can send abnormally large data from the client
+to the server and it would get stored on the sign as sent.
+
+the client can barely render around 16 characters as-is, but formatting
+codes can get it to be more than 16 actual length.
+
+Set a limit of 80 which should give an average of 16 characters 2
+sets of legacy formatting codes which should be plenty for all uses.
+
+This does not strip any existing data from the NBT as plugins
+may use this for storing data out of the rendered area.
+
+it only impacts data sent to and from the client.
+
+Set -DPaper.maxSignLength=XX to change limit or -1 to disable
+
+diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
+index de62c3b7..cb47e54d 100644
+--- a/src/main/java/net/minecraft/server/PlayerConnection.java
++++ b/src/main/java/net/minecraft/server/PlayerConnection.java
+@@ -2227,6 +2227,11 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+ String[] lines = new String[4];
+
+ for (int i = 0; i < astring.length; ++i) {
++ // Paper start - cap line length - modified clients can send longer data than normal
++ if (astring[i].length() > TileEntitySign.MAX_SIGN_LINE_LENGTH && TileEntitySign.MAX_SIGN_LINE_LENGTH > 0) {
++ astring[i] = astring[i].substring(0, TileEntitySign.MAX_SIGN_LINE_LENGTH);
++ }
++ // Paper end
+ lines[i] = SharedConstants.a(astring[i]); //Paper - Replaced with anvil color stripping method to stop exploits that allow colored signs to be created.
+ }
+ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), lines);
+diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java
+index 67bd3bcb..786b2984 100644
+--- a/src/main/java/net/minecraft/server/TileEntitySign.java
++++ b/src/main/java/net/minecraft/server/TileEntitySign.java
+@@ -9,16 +9,22 @@ public class TileEntitySign extends TileEntity {
+ public boolean isEditable = true;
+ private EntityHuman h;
+ private final CommandObjectiveExecutor i = new CommandObjectiveExecutor();
++ public static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper
+
+ public TileEntitySign() {}
+
++ // Paper start
+ public NBTTagCompound save(NBTTagCompound nbttagcompound) {
++ return save(nbttagcompound, false);
++ }
++ public NBTTagCompound save(NBTTagCompound nbttagcompound, boolean filterLines) {
++ // Paper end
+ super.save(nbttagcompound);
+
+ for (int i = 0; i < 4; ++i) {
+ String s = IChatBaseComponent.ChatSerializer.a(this.lines[i]);
+
+- nbttagcompound.setString("Text" + (i + 1), s);
++ nbttagcompound.setString("Text" + (i + 1), filterLines && MAX_SIGN_LINE_LENGTH > 0 && s.length() > MAX_SIGN_LINE_LENGTH ? s.substring(0, MAX_SIGN_LINE_LENGTH): s); // Paper
+ }
+
+ // CraftBukkit start
+@@ -105,7 +111,7 @@ public class TileEntitySign extends TileEntity {
+ }
+
+ public NBTTagCompound d() {
+- return this.save(new NBTTagCompound());
++ return this.save(new NBTTagCompound(), true); // Paper - filter lines
+ }
+
+ public boolean isFilteredNBT() {
+--
+2.20.1
+
diff --git a/Spigot-Server-Patches/0375-Fix-sign-edit-memory-leak.patch b/Spigot-Server-Patches/0375-Fix-sign-edit-memory-leak.patch
new file mode 100644
index 0000000000..dc299737ba
--- /dev/null
+++ b/Spigot-Server-Patches/0375-Fix-sign-edit-memory-leak.patch
@@ -0,0 +1,47 @@
+From 5a1e1396b62a291dc2f6a2b3ee92cce18b8ebd74 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Thu, 28 Feb 2019 00:15:28 -0500
+Subject: [PATCH] Fix sign edit memory leak
+
+when a player edits a sign, a reference to their Entity is never cleand up.
+
+diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
+index cb47e54d..68728d43 100644
+--- a/src/main/java/net/minecraft/server/PlayerConnection.java
++++ b/src/main/java/net/minecraft/server/PlayerConnection.java
+@@ -2211,7 +2211,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+
+ TileEntitySign tileentitysign = (TileEntitySign) tileentity;
+
+- if (!tileentitysign.a() || tileentitysign.e() != this.player) {
++ if (!tileentitysign.a() || tileentitysign.signEditor == null || !tileentitysign.signEditor.equals(this.player.getUniqueID())) { // Paper
+ this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign");
+ this.sendPacket(tileentity.getUpdatePacket()); // CraftBukkit
+ return;
+diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java
+index 786b2984..e7d9d811 100644
+--- a/src/main/java/net/minecraft/server/TileEntitySign.java
++++ b/src/main/java/net/minecraft/server/TileEntitySign.java
+@@ -10,6 +10,7 @@ public class TileEntitySign extends TileEntity {
+ private EntityHuman h;
+ private final CommandObjectiveExecutor i = new CommandObjectiveExecutor();
+ public static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper
++ public java.util.UUID signEditor; // Paper
+
+ public TileEntitySign() {}
+
+@@ -123,7 +124,10 @@ public class TileEntitySign extends TileEntity {
+ }
+
+ public void a(EntityHuman entityhuman) {
+- this.h = entityhuman;
++ // Paper start
++ //this.h = entityhuman;
++ signEditor = entityhuman != null ? entityhuman.getUniqueID() : null;
++ // Paper end
+ }
+
+ public EntityHuman e() {
+--
+2.20.1
+