--- a/net/minecraft/server/PacketDataSerializer.java +++ b/net/minecraft/server/PacketDataSerializer.java @@ -20,9 +20,12 @@ import java.nio.charset.Charset; import java.util.UUID; +import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit + public class PacketDataSerializer extends ByteBuf { private final ByteBuf a; + int version = 107; // CraftBukkkit public PacketDataSerializer(ByteBuf bytebuf) { this.a = bytebuf; @@ -44,8 +47,16 @@ return this; } + // CraftBukkit start - limit length public byte[] a() { - byte[] abyte = new byte[this.g()]; + return readByteArray(Short.MAX_VALUE); + } + + public byte[] readByteArray(int limit) { + int len = this.g(); + if (len > limit) throw new DecoderException("The received a byte array longer than allowed " + len + " > " + limit); + byte[] abyte = new byte[len]; + // CraftBukkit end this.readBytes(abyte); return abyte; @@ -99,7 +110,7 @@ } public > T a(Class oclass) { - return ((Enum[]) oclass.getEnumConstants())[this.g()]; + return ((T[]) oclass.getEnumConstants())[this.g()]; // CraftBukkit - fix decompile error } public PacketDataSerializer a(Enum oenum) { @@ -176,7 +187,7 @@ } else { try { NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) (new ByteBufOutputStream(this))); - } catch (IOException ioexception) { + } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception throw new EncoderException(ioexception); } } @@ -202,7 +213,7 @@ } public PacketDataSerializer a(ItemStack itemstack) { - if (itemstack == null) { + if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() this.writeShort(-1); } else { this.writeShort(Item.getId(itemstack.getItem())); @@ -230,6 +241,11 @@ itemstack = new ItemStack(Item.getById(short0), b0, short1); itemstack.setTag(this.j()); + // CraftBukkit start + if (itemstack.getTag() != null) { + CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); + } + // CraftBukkit end } return itemstack;