Scissors/patches/server/0045-Add-depth-limit-to-SNBT.patch
Luna 65d7993679
Backport 1.20.1 patches to 1.19.4 (#116)
* First pass

* Second and final pass

* Update Jenkinsfile
2023-07-04 16:10:53 -05:00

111 lines
3.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Allink <arclicious@vivaldi.net>
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..426425e38698b06d46c5e6a41b39d362176a4ee3 100644
--- a/src/main/java/net/minecraft/nbt/TagParser.java
+++ b/src/main/java/net/minecraft/nbt/TagParser.java
@@ -169,8 +169,56 @@ public class TagParser {
}
this.expect('}');
- 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('[');
@@ -203,7 +251,7 @@ public class TagParser {
}
this.expect(']');
- return listTag;
+ return exceedsDepthLimit(listTag) ? new ListTag() : listTag; // Scissors - Add depth limit to SNBT
}
}
@@ -228,7 +276,7 @@ public class TagParser {
}
private <T extends Number> List<T> readArray(TagType<?> arrayTypeReader, TagType<?> typeReader) throws CommandSyntaxException {
- List<T> list = Lists.newArrayList();
+ List<Number> list = Lists.newArrayList(); // Scissors - List<T> -> List<Number>
while(true) {
if (this.reader.peek() != ']') {
@@ -241,11 +289,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 +305,7 @@ public class TagParser {
}
this.expect(']');
- return list;
+ return (List<T>) list; // Scissors - Cast to List<T>
}
}