90fe0d58a5
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 897a0a23 SPIGOT-5753: Back PotionType by a minecraft registry 255b2aa1 SPIGOT-7080: Add World#locateNearestBiome ff984826 Remove javadoc.io doc links CraftBukkit Changes: 71b0135cc SPIGOT-5753: Back PotionType by a minecraft registry a6bcb8489 SPIGOT-7080: Add World#locateNearestBiome ad0e57434 SPIGOT-7502: CraftMetaItem - cannot deserialize BlockStateTag b3efca57a SPIGOT-6400: Use Mockito instead of InvocationHandler 38c599f9d PR-1272: Only allow one entity in CraftItem instead of two f065271ac SPIGOT-7498: ChunkSnapshot.getBlockEmittedLight() gets 64 blocks upper in Overworld Spigot Changes: e0e223fe Remove javadoc.io doc links
87 Zeilen
4.7 KiB
Diff
87 Zeilen
4.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Nassim Jahnke <nassim@njahnke.dev>
|
|
Date: Wed, 1 Dec 2021 12:36:25 +0100
|
|
Subject: [PATCH] Prevent sending oversized item data in equipment and metadata
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/network/syncher/EntityDataSerializers.java b/src/main/java/net/minecraft/network/syncher/EntityDataSerializers.java
|
|
index 97da8896865ff0bdd4fe8f2155b0830b42051bb1..9ca897d92c5bdd2764d114c74d64c776674d6beb 100644
|
|
--- a/src/main/java/net/minecraft/network/syncher/EntityDataSerializers.java
|
|
+++ b/src/main/java/net/minecraft/network/syncher/EntityDataSerializers.java
|
|
@@ -42,7 +42,7 @@ public class EntityDataSerializers {
|
|
public static final EntityDataSerializer<ItemStack> ITEM_STACK = new EntityDataSerializer<ItemStack>() {
|
|
@Override
|
|
public void write(FriendlyByteBuf buf, ItemStack value) {
|
|
- buf.writeItem(value);
|
|
+ buf.writeItem(net.minecraft.world.entity.LivingEntity.sanitizeItemStack(value, true)); // Paper - prevent oversized data
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
index e0802f1cb73a80b08482832c2b269ac8485d5c1a..8d2870c780c4c253f6570c7ef73f6e7c2ccc46ad 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
|
@@ -335,7 +335,10 @@ public class ServerEntity {
|
|
ItemStack itemstack = ((LivingEntity) this.entity).getItemBySlot(enumitemslot);
|
|
|
|
if (!itemstack.isEmpty()) {
|
|
- list.add(Pair.of(enumitemslot, itemstack.copy()));
|
|
+ // Paper start - prevent oversized data
|
|
+ final ItemStack sanitized = LivingEntity.sanitizeItemStack(itemstack.copy(), false);
|
|
+ list.add(Pair.of(enumitemslot, sanitized));
|
|
+ // Paper end
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 743ad0879e240bb88b2a6735b565911c44cfad8b..f8738a28fb30c8fdb52ed3e6f8000144129c1f00 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3194,7 +3194,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
equipmentChanges.forEach((enumitemslot, itemstack) -> {
|
|
ItemStack itemstack1 = itemstack.copy();
|
|
|
|
- list.add(Pair.of(enumitemslot, itemstack1));
|
|
+ // Paper start - prevent oversized data
|
|
+ ItemStack toSend = sanitizeItemStack(itemstack1, true);
|
|
+ list.add(Pair.of(enumitemslot, toSend));
|
|
+ // Paper end
|
|
switch (enumitemslot.getType()) {
|
|
case HAND:
|
|
this.setLastHandItem(enumitemslot, itemstack1);
|
|
@@ -3207,6 +3210,34 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
((ServerLevel) this.level()).getChunkSource().broadcast(this, new ClientboundSetEquipmentPacket(this.getId(), list));
|
|
}
|
|
|
|
+ // Paper start - prevent oversized data
|
|
+ public static ItemStack sanitizeItemStack(final ItemStack itemStack, final boolean copyItemStack) {
|
|
+ if (itemStack.isEmpty() || !itemStack.hasTag()) {
|
|
+ return itemStack;
|
|
+ }
|
|
+
|
|
+ final ItemStack copy = copyItemStack ? itemStack.copy() : itemStack;
|
|
+ final CompoundTag tag = copy.getTag();
|
|
+ if (copy.is(Items.BUNDLE) && tag.get("Items") instanceof ListTag oldItems && !oldItems.isEmpty()) {
|
|
+ // Bundles change their texture based on their fullness.
|
|
+ org.bukkit.inventory.meta.BundleMeta bundleMeta = (org.bukkit.inventory.meta.BundleMeta) copy.asBukkitMirror().getItemMeta();
|
|
+ int sizeUsed = 0;
|
|
+ for (org.bukkit.inventory.ItemStack item : bundleMeta.getItems()) {
|
|
+ int scale = 64 / item.getMaxStackSize();
|
|
+ sizeUsed += scale * item.getAmount();
|
|
+ }
|
|
+ // Now we add a single fake item that uses the same amount of slots as all other items.
|
|
+ ListTag items = new ListTag();
|
|
+ items.add(new ItemStack(Items.PAPER, sizeUsed).save(new CompoundTag()));
|
|
+ tag.put("Items", items);
|
|
+ }
|
|
+ if (tag.get("BlockEntityTag") instanceof CompoundTag blockEntityTag) {
|
|
+ blockEntityTag.remove("Items");
|
|
+ }
|
|
+ return copy;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
private ItemStack getLastArmorItem(EquipmentSlot slot) {
|
|
return (ItemStack) this.lastArmorItemStacks.get(slot.getIndex());
|
|
}
|