From 608e04a5390d1f70ca5c775cfaa4bc68bc245316 Mon Sep 17 00:00:00 2001 From: retgal Date: Thu, 18 Apr 2024 16:38:37 +0200 Subject: [PATCH] Do not expose mutable objects --- .../dayon/assisted/capture/RobotCaptureFactory.java | 2 +- .../mpo/dayon/assisted/utils/ScreenUtilities.java | 2 +- .../java/mpo/dayon/common/buffer/MemByteBuffer.java | 11 ++++++++++- src/main/java/mpo/dayon/common/capture/Capture.java | 4 ++-- .../java/mpo/dayon/common/capture/CaptureTile.java | 4 ++-- .../mpo/dayon/common/network/TransferableImage.java | 4 ++-- .../common/network/message/NetworkCaptureMessage.java | 2 +- .../message/NetworkClipboardGraphicMessage.java | 4 ++-- 8 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/mpo/dayon/assisted/capture/RobotCaptureFactory.java b/src/main/java/mpo/dayon/assisted/capture/RobotCaptureFactory.java index 05fdd4f6..d1b2eb51 100644 --- a/src/main/java/mpo/dayon/assisted/capture/RobotCaptureFactory.java +++ b/src/main/java/mpo/dayon/assisted/capture/RobotCaptureFactory.java @@ -15,7 +15,7 @@ public RobotCaptureFactory(boolean allScreens) { @Override public Dimension getDimension() { - return captureDimension; + return new Dimension(captureDimension); } @Override diff --git a/src/main/java/mpo/dayon/assisted/utils/ScreenUtilities.java b/src/main/java/mpo/dayon/assisted/utils/ScreenUtilities.java index d7704b04..d6218506 100644 --- a/src/main/java/mpo/dayon/assisted/utils/ScreenUtilities.java +++ b/src/main/java/mpo/dayon/assisted/utils/ScreenUtilities.java @@ -54,7 +54,7 @@ public static synchronized void setShareAllScreens(boolean doShareAllScreens) { } public static Rectangle getSharedScreenSize() { - return sharedScreenSize; + return new Rectangle(sharedScreenSize); } public static int getNumberOfScreens() { diff --git a/src/main/java/mpo/dayon/common/buffer/MemByteBuffer.java b/src/main/java/mpo/dayon/common/buffer/MemByteBuffer.java index 83ffd708..89113f7e 100644 --- a/src/main/java/mpo/dayon/common/buffer/MemByteBuffer.java +++ b/src/main/java/mpo/dayon/common/buffer/MemByteBuffer.java @@ -6,7 +6,7 @@ /** * A mixed between a byte buffer and a byte stream ... */ -public class MemByteBuffer extends OutputStream { +public class MemByteBuffer extends OutputStream implements Cloneable { private static final int DEFAULT_INITIAL_CAPACITY = 32; private byte[] buffer; @@ -127,4 +127,13 @@ private void increaseBuffer(int newCount) { buffer = Arrays.copyOf(buffer, Math.max(buffer.length << 1, newCount)); } } + + @Override + public final MemByteBuffer clone() { + try { + return (MemByteBuffer) super.clone(); + } catch (CloneNotSupportedException e) { + return new MemByteBuffer(buffer); + } + } } diff --git a/src/main/java/mpo/dayon/common/capture/Capture.java b/src/main/java/mpo/dayon/common/capture/Capture.java index 288fea95..653eefc1 100644 --- a/src/main/java/mpo/dayon/common/capture/Capture.java +++ b/src/main/java/mpo/dayon/common/capture/Capture.java @@ -43,8 +43,8 @@ public Capture(int captureId, boolean reset, int skipped, int merged, Dimension this.reset = reset; this.skipped = new AtomicInteger(skipped); this.merged = new AtomicInteger(merged); - this.captureDimension = captureDimension; - this.tileDimension = tileDimension; + this.captureDimension = new Dimension(captureDimension); + this.tileDimension = new Dimension(tileDimension); this.dirty = dirty.clone(); } diff --git a/src/main/java/mpo/dayon/common/capture/CaptureTile.java b/src/main/java/mpo/dayon/common/capture/CaptureTile.java index 38b9629f..ad6757ba 100644 --- a/src/main/java/mpo/dayon/common/capture/CaptureTile.java +++ b/src/main/java/mpo/dayon/common/capture/CaptureTile.java @@ -68,7 +68,7 @@ public CaptureTile(int captureId, int id, XYWH xywh, MemByteBuffer capture) { this.position = new Position(xywh.x, xywh.y); this.width = xywh.w; this.height = xywh.h; - this.capture = capture; + this.capture = capture.clone(); if (width * height != capture.size()) { throw new IllegalArgumentException("Ouch!"); } @@ -149,7 +149,7 @@ public int getHeight() { } public MemByteBuffer getCapture() { - return capture; + return capture.clone(); } /** diff --git a/src/main/java/mpo/dayon/common/network/TransferableImage.java b/src/main/java/mpo/dayon/common/network/TransferableImage.java index 3bce6267..e5f3d335 100644 --- a/src/main/java/mpo/dayon/common/network/TransferableImage.java +++ b/src/main/java/mpo/dayon/common/network/TransferableImage.java @@ -17,7 +17,7 @@ public class TransferableImage implements Transferable, Serializable { private transient BufferedImage image; public TransferableImage(BufferedImage image) { - this.image = image; + this.image = image.getSubimage(0, 0, image.getWidth(), image.getHeight()); } private void writeObject(ObjectOutputStream out) throws IOException { @@ -42,6 +42,6 @@ public BufferedImage getTransferData(DataFlavor flavor) { if (!DataFlavor.imageFlavor.equals(flavor)) { Log.error(new UnsupportedFlavorException(flavor).getMessage()); } - return image; + return image.getSubimage(0, 0, image.getWidth(), image.getHeight()); } } diff --git a/src/main/java/mpo/dayon/common/network/message/NetworkCaptureMessage.java b/src/main/java/mpo/dayon/common/network/message/NetworkCaptureMessage.java index b85fa0a7..692cf024 100644 --- a/src/main/java/mpo/dayon/common/network/message/NetworkCaptureMessage.java +++ b/src/main/java/mpo/dayon/common/network/message/NetworkCaptureMessage.java @@ -98,7 +98,7 @@ public static NetworkCaptureMessage unmarshall(ObjectInputStream in) throws IOEx } public MemByteBuffer getPayload() { - return payload; + return payload.clone(); } public String toString() { diff --git a/src/main/java/mpo/dayon/common/network/message/NetworkClipboardGraphicMessage.java b/src/main/java/mpo/dayon/common/network/message/NetworkClipboardGraphicMessage.java index f51fd61c..73303de5 100644 --- a/src/main/java/mpo/dayon/common/network/message/NetworkClipboardGraphicMessage.java +++ b/src/main/java/mpo/dayon/common/network/message/NetworkClipboardGraphicMessage.java @@ -13,7 +13,7 @@ public class NetworkClipboardGraphicMessage extends NetworkMessage { private final int size; public NetworkClipboardGraphicMessage(TransferableImage payload) { - this.payload = payload; + this.payload = new TransferableImage(payload.getTransferData(DataFlavor.imageFlavor)); // this is just a rather rough estimation this.size = payload.getTransferData(DataFlavor.imageFlavor).getData().getDataBuffer().getSize() * 4; } @@ -24,7 +24,7 @@ public static NetworkClipboardGraphicMessage unmarshall(ObjectInputStream in) th } public TransferableImage getGraphic() { - return payload; + return new TransferableImage(payload.getTransferData(DataFlavor.imageFlavor)); } @Override