diff --git a/patches/server/0048-Add-depth-limit-to-SNBT.patch b/patches/server/0048-Add-depth-limit-to-SNBT.patch new file mode 100644 index 0000000..e5510ce --- /dev/null +++ b/patches/server/0048-Add-depth-limit-to-SNBT.patch @@ -0,0 +1,116 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Allink +Date: Fri, 2 Jun 2023 22:13:54 +0100 +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 fbfe810e8be6cb159742f7fd85e7491b9cefa4dc..82b1d851e310504e7373a967dfb5b0b096d36693 100644 +--- a/src/main/java/net/minecraft/nbt/TagParser.java ++++ b/src/main/java/net/minecraft/nbt/TagParser.java +@@ -169,8 +169,58 @@ public class TagParser { + } + + this.expect('}'); +- return compoundTag; ++ ++ // Scissors start - Add depth limit to SNBT ++ return exceedsDepthLimit(compoundTag) ? new CompoundTag() : compoundTag; ++ // Scissors end ++ } ++ ++ // 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('['); +@@ -203,7 +253,11 @@ public class TagParser { + } + + this.expect(']'); +- return listTag; ++ ++ // Scissors start - Add depth limit to SNBT ++ return exceedsDepthLimit(listTag) ? new ListTag() : listTag; ++ // return listTag; ++ // Scissors end + } + } + +@@ -228,7 +282,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(true) { + if (this.reader.peek() != ']') { +@@ -241,11 +295,11 @@ public class TagParser { + } + + if (typeReader == ByteTag.TYPE) { +- list.add((T)((NumericTag)tag).getAsByte()); ++ list.add(((NumericTag)tag).getAsByte()); // Scissors - Remove (T) cast + } else if (typeReader == LongTag.TYPE) { +- list.add((T)((NumericTag)tag).getAsLong()); ++ list.add(((NumericTag)tag).getAsLong()); // Scissors - Remove (T) cast + } else { +- list.add((T)((NumericTag)tag).getAsInt()); ++ list.add(((NumericTag)tag).getAsInt()); // Scissors - Remove (T) cast + } + + if (this.hasElementSeparator()) { +@@ -257,7 +311,7 @@ public class TagParser { + } + + this.expect(']'); +- return list; ++ return (List) list; // Scissors - Cast to List + } + } +