2024-01-04 13:52:38 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Nassim Jahnke <nassim@njahnke.dev>
|
|
|
|
Date: Thu, 4 Jan 2024 13:49:14 +0100
|
|
|
|
Subject: [PATCH] Validate ResourceLocation in NBT reading
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/nbt/NbtUtils.java b/src/main/java/net/minecraft/nbt/NbtUtils.java
|
2024-01-21 19:37:09 +01:00
|
|
|
index ba0726157417cdde1c9bca93a9e37e68d9b2286d..e3a3f19a6e63fd42e29c418e5a7439972484d492 100644
|
2024-01-04 13:52:38 +01:00
|
|
|
--- a/src/main/java/net/minecraft/nbt/NbtUtils.java
|
|
|
|
+++ b/src/main/java/net/minecraft/nbt/NbtUtils.java
|
|
|
|
@@ -230,8 +230,10 @@ public final class NbtUtils {
|
|
|
|
if (!nbt.contains("Name", 8)) {
|
|
|
|
return Blocks.AIR.defaultBlockState();
|
|
|
|
} else {
|
|
|
|
- ResourceLocation resourceLocation = new ResourceLocation(nbt.getString("Name"));
|
|
|
|
- Optional<? extends Holder<Block>> optional = blockLookup.get(ResourceKey.create(Registries.BLOCK, resourceLocation));
|
|
|
|
+ // Paper start - Validate resource location
|
|
|
|
+ ResourceLocation resourceLocation = ResourceLocation.tryParse(nbt.getString("Name"));
|
|
|
|
+ Optional<? extends Holder<Block>> optional = resourceLocation != null ? blockLookup.get(ResourceKey.create(Registries.BLOCK, resourceLocation)) : Optional.empty();
|
2024-01-13 16:35:59 +01:00
|
|
|
+ // Paper end - Validate resource location
|
2024-01-04 13:52:38 +01:00
|
|
|
if (optional.isEmpty()) {
|
|
|
|
return Blocks.AIR.defaultBlockState();
|
|
|
|
} else {
|
2024-01-12 19:33:17 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/resources/ResourceLocation.java b/src/main/java/net/minecraft/resources/ResourceLocation.java
|
2024-01-19 12:30:04 +01:00
|
|
|
index 5f9dcab27a07969c93555ad0892683c62cbebc8c..a4d875df936b6de16f0233482b03af05b427a79f 100644
|
2024-01-12 19:33:17 +01:00
|
|
|
--- a/src/main/java/net/minecraft/resources/ResourceLocation.java
|
|
|
|
+++ b/src/main/java/net/minecraft/resources/ResourceLocation.java
|
2024-01-12 23:08:19 +01:00
|
|
|
@@ -31,6 +31,13 @@ public class ResourceLocation implements Comparable<ResourceLocation> {
|
2024-01-12 19:33:17 +01:00
|
|
|
private final String path;
|
|
|
|
|
|
|
|
protected ResourceLocation(String namespace, String path, @Nullable ResourceLocation.Dummy extraData) {
|
2024-01-12 23:08:19 +01:00
|
|
|
+ // Paper start - Validate ResourceLocation
|
|
|
|
+ // Check for the max network string length (capped at Short.MAX_VALUE) as well as the max bytes of a StringTag (length written as an unsigned short)
|
|
|
|
+ final String resourceLocation = namespace + ":" + path;
|
|
|
|
+ if (resourceLocation.length() > Short.MAX_VALUE || io.netty.buffer.ByteBufUtil.utf8MaxBytes(resourceLocation) > 2 * Short.MAX_VALUE + 1) {
|
|
|
|
+ throw new ResourceLocationException("Resource location too long: " + resourceLocation);
|
|
|
|
+ }
|
|
|
|
+ // Paper end - Validate ResourceLocation
|
2024-01-12 19:33:17 +01:00
|
|
|
this.namespace = namespace;
|
|
|
|
this.path = path;
|
|
|
|
}
|
2024-01-06 09:51:49 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
2024-02-01 10:15:57 +01:00
|
|
|
index 8ba573bb4099ee5b27b61f333e72d794c48d5f29..69bdf3f2ee731e59e8d454816a9ca72cb49c0fe0 100644
|
2024-01-06 09:51:49 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -614,7 +614,7 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
2024-01-06 09:51:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static Optional<EntityType<?>> by(CompoundTag nbt) {
|
|
|
|
- return BuiltInRegistries.ENTITY_TYPE.getOptional(new ResourceLocation(nbt.getString("id")));
|
|
|
|
+ return BuiltInRegistries.ENTITY_TYPE.getOptional(ResourceLocation.tryParse(nbt.getString("id"))); // Paper - Validate ResourceLocation
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
2024-01-04 13:52:38 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
|
2024-01-24 11:45:17 +01:00
|
|
|
index 026654c4d3a910f0dbfed5475f23137086618242..1881deb9d8ffc884ba23843936615181f4220623 100644
|
2024-01-04 13:52:38 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
2024-01-23 15:43:48 +01:00
|
|
|
@@ -607,7 +607,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
|
2024-01-04 13:52:38 +01:00
|
|
|
|
|
|
|
this.setLeftHanded(nbt.getBoolean("LeftHanded"));
|
|
|
|
if (nbt.contains("DeathLootTable", 8)) {
|
|
|
|
- this.lootTable = new ResourceLocation(nbt.getString("DeathLootTable"));
|
|
|
|
+ this.lootTable = ResourceLocation.tryParse(nbt.getString("DeathLootTable")); // Paper - Validate ResourceLocation
|
|
|
|
this.lootTableSeed = nbt.getLong("DeathLootTableSeed");
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
2024-01-23 15:43:48 +01:00
|
|
|
index 618de60680de015bc68bf95a68eda98db7bab3c5..d14eab0d83d629a4522bf3f7d789d2853eb84f06 100644
|
2024-01-04 13:52:38 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
|
|
@@ -560,7 +560,7 @@ public abstract class AbstractArrow extends Projectile {
|
|
|
|
this.setCritArrow(nbt.getBoolean("crit"));
|
|
|
|
this.setPierceLevel(nbt.getByte("PierceLevel"));
|
|
|
|
if (nbt.contains("SoundEvent", 8)) {
|
|
|
|
- this.soundEvent = (SoundEvent) BuiltInRegistries.SOUND_EVENT.getOptional(new ResourceLocation(nbt.getString("SoundEvent"))).orElse(this.getDefaultHitGroundSoundEvent());
|
|
|
|
+ this.soundEvent = (SoundEvent) BuiltInRegistries.SOUND_EVENT.getOptional(ResourceLocation.tryParse(nbt.getString("SoundEvent"))).orElse(this.getDefaultHitGroundSoundEvent()); // Paper - Validate resource location
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setShotFromCrossbow(nbt.getBoolean("ShotFromCrossbow"));
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
|
|
index 7529751afa2932fd16bc4591189b0358268a7b14..e2e1c7a017e82dc7299e5cd1783818e4f0319c0b 100644
|
|
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
|
|
@@ -67,7 +67,7 @@ public interface ContainerEntity extends Container, MenuProvider {
|
|
|
|
default void readChestVehicleSaveData(CompoundTag nbt) {
|
|
|
|
this.clearItemStacks();
|
|
|
|
if (nbt.contains("LootTable", 8)) {
|
|
|
|
- this.setLootTable(new ResourceLocation(nbt.getString("LootTable")));
|
|
|
|
+ this.setLootTable(ResourceLocation.tryParse(nbt.getString("LootTable"))); // Paper - Validate ResourceLocation
|
|
|
|
this.setLootTableSeed(nbt.getLong("LootTableSeed"));
|
|
|
|
}
|
|
|
|
|