From 3f1e8fa4d48ed00c5fdcd64b3ed5bb9c9695ecf9 Mon Sep 17 00:00:00 2001 From: Aurora <21148213+aurorasmiles@users.noreply.github.com> Date: Thu, 24 Sep 2020 19:10:43 +0200 Subject: [PATCH] Fixes unsafe memory access using cross server clipboards (#651) Co-authored-by: wea_ondara --- .../worldedit/command/ClipboardCommands.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index 4148fce93..f0a372372 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -25,6 +25,7 @@ import com.boydti.fawe.config.Caption; import com.boydti.fawe.config.Settings; import com.boydti.fawe.object.FaweLimit; import com.boydti.fawe.object.RunnableVal; +import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; import com.boydti.fawe.object.clipboard.MultiClipboardHolder; import com.boydti.fawe.object.clipboard.ReadOnlyClipboard; import com.boydti.fawe.object.clipboard.URIClipboardHolder; @@ -148,6 +149,7 @@ public class ClipboardCommands { copy.setSourceMask(mask); } Operations.completeLegacy(copy); + saveDiskClipboard(clipboard); session.setClipboard(new ClipboardHolder(clipboard)); copy.getStatusMessages().forEach(actor::print); @@ -259,6 +261,7 @@ public class ClipboardCommands { copy.setSourceMask(mask); } Operations.completeLegacy(copy); + saveDiskClipboard(clipboard); session.setClipboard(new ClipboardHolder(clipboard)); if (!actor.hasPermission("fawe.tips")) { @@ -539,4 +542,16 @@ public class ClipboardCommands { session.setClipboard(null); actor.printInfo(TranslatableComponent.of("worldedit.clearclipboard.cleared")); } + + private void saveDiskClipboard(Clipboard clipboard) { + DiskOptimizedClipboard c; + if (clipboard instanceof DiskOptimizedClipboard) + c = (DiskOptimizedClipboard) clipboard; + else if (clipboard instanceof BlockArrayClipboard + && ((BlockArrayClipboard) clipboard).getParent() instanceof DiskOptimizedClipboard) + c = (DiskOptimizedClipboard) ((BlockArrayClipboard) clipboard).getParent(); + else + return; + c.flush(); + } }