From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Mon, 15 Apr 2024 23:40:27 -0500 Subject: [PATCH] Add depth limit to SNBT diff --git a/src/main/java/net/minecraft/nbt/TagParser.java b/src/main/java/net/minecraft/nbt/TagParser.java index c77860a141064aea6a0b510bb44d35fea90aee42..3be3dd61b8a27b3a8ca3c72ae5ffa2ea8fa00231 100644 --- a/src/main/java/net/minecraft/nbt/TagParser.java +++ b/src/main/java/net/minecraft/nbt/TagParser.java @@ -184,9 +184,47 @@ public class TagParser { this.expect('}'); this.depth--; // Paper - return compoundTag; + return exceedsDepthLimit(compoundTag) ? new CompoundTag() : compoundTag; // Scissors - Add depth limit to SNBT } + // Scissors start - Add depth limit to SNBT + private boolean exceedsDepthLimit(Tag tag) { + return this.exceedsDepthLimit(0, tag); + } + + private boolean exceedsDepthLimit(long depth, Tag tag) { + if (depth > 256) { + return true; + } + + if (tag instanceof ListTag listTag) { + for (Tag childTag : listTag) { + boolean returnValue = this.exceedsDepthLimit(depth + 1, childTag); + + if (returnValue) { + return true; + } + } + } else if (tag instanceof CompoundTag compoundTag) { + for (String key : compoundTag.getAllKeys()) { + Tag childTag = compoundTag.get(key); + + if (childTag == null) { + continue; + } + + boolean returnValue = this.exceedsDepthLimit(depth + 1, childTag); + + if (returnValue) { + return true; + } + } + } + + return false; + } + // Scissors end + private Tag readListTag() throws CommandSyntaxException { this.expect('['); this.reader.skipWhitespace(); @@ -220,7 +258,7 @@ public class TagParser { this.expect(']'); this.depth--; // Paper - return listTag; + return exceedsDepthLimit(listTag) ? new ListTag() : listTag; // Scissors - Add depth limit to SNBT } } @@ -245,7 +283,7 @@ public class TagParser { } private List readArray(TagType arrayTypeReader, TagType typeReader) throws CommandSyntaxException { - List list = Lists.newArrayList(); + List list = Lists.newArrayList(); // Scissors - List -> List while (this.reader.peek() != ']') { int i = this.reader.getCursor(); @@ -257,11 +295,11 @@ public class TagParser { } if (typeReader == ByteTag.TYPE) { - list.add((T)(Byte)((NumericTag)tag).getAsByte()); // Paper - decompile fix + list.add(((NumericTag)tag).getAsByte()); // Scissors - Remove (T) cast } else if (typeReader == LongTag.TYPE) { - list.add((T)(Long)((NumericTag)tag).getAsLong()); // Paper - decompile fix + list.add(((NumericTag)tag).getAsLong()); // Scissors - Remove (T) cast } else { - list.add((T)(Integer)((NumericTag)tag).getAsInt()); // Paper - decompile fix + list.add(((NumericTag)tag).getAsInt()); // Scissors - Remove (T) cast } if (!this.hasElementSeparator()) { @@ -274,7 +312,7 @@ public class TagParser { } this.expect(']'); - return list; + return (List) list; // Scissors - Cast to List } private boolean hasElementSeparator() {