From 3632ebda8b61735f95f6b0b822411285260adbe7 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 10 Sep 2021 16:32:09 -0400 Subject: [PATCH] Prevent concurrency issues with SkinProvider#requestedSkins There is a small potential here to return null if containsKey runs before remove and then get is called. --- .../main/java/org/geysermc/connector/skin/SkinProvider.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java index 4b97ba5fb..ed18f2c22 100644 --- a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java @@ -163,7 +163,11 @@ public class SkinProvider { public static CompletableFuture requestSkin(UUID playerId, String textureUrl, boolean newThread) { if (textureUrl == null || textureUrl.isEmpty()) return CompletableFuture.completedFuture(EMPTY_SKIN); - if (requestedSkins.containsKey(textureUrl)) return requestedSkins.get(textureUrl); // already requested + CompletableFuture requestedSkin = requestedSkins.get(textureUrl); + if (requestedSkin != null) { + // already requested + return requestedSkin; + } Skin cachedSkin = getCachedSkin(textureUrl); if (cachedSkin != null) {