From fefa48d3c47a2cfbedf6dd544354a2db97760b85 Mon Sep 17 00:00:00 2001 From: Brian Hinz Date: Sat, 23 Nov 2013 05:05:21 +0000 Subject: [PATCH] Fixes a condition where too much data on the local clipboard causes the client to exceed the max heap size and exit. Since the server will, by default, discard clipboard transfers greater than 256KB anyway, a parameter was added which sets the default max clipboard size that the client will hold to 256KB also. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5138 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- .../tigervnc/vncviewer/ClipboardDialog.java | 24 ++++++-------- .../com/tigervnc/vncviewer/DesktopWindow.java | 31 ++++++++++--------- java/com/tigervnc/vncviewer/VncViewer.java | 4 +++ 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/java/com/tigervnc/vncviewer/ClipboardDialog.java b/java/com/tigervnc/vncviewer/ClipboardDialog.java index d6e2525c..2c9b7d0f 100644 --- a/java/com/tigervnc/vncviewer/ClipboardDialog.java +++ b/java/com/tigervnc/vncviewer/ClipboardDialog.java @@ -57,15 +57,12 @@ class ClipboardDialog extends Dialog implements ActionListener { pack(); } - public void initDialog() { - textArea.setText(current); - textArea.selectAll(); - } - public void setContents(String str) { - current = str; textArea.setText(str); - textArea.selectAll(); + } + + public String getContents() { + return textArea.getText(); } public void serverCutText(String str, int len) { @@ -77,13 +74,13 @@ class ClipboardDialog extends Dialog implements ActionListener { if (cb != null) { StringSelection ss = new StringSelection(str); try { - cb.setContents(ss, ss); + cb.setContents(ss, null); } catch(Exception e) { - vlog.debug(e.toString()); + vlog.debug(e.getMessage()); } } } catch(SecurityException e) { - System.err.println("Cannot access the system clipboard"); + vlog.debug("Cannot access the system clipboard: "+e.getMessage()); } } @@ -94,11 +91,9 @@ class ClipboardDialog extends Dialog implements ActionListener { public void actionPerformed(ActionEvent e) { Object s = e.getSource(); if (s instanceof JButton && (JButton)s == clearButton) { - current = ""; - textArea.setText(current); + serverCutText(new String(""), 0); } else if (s instanceof JButton && (JButton)s == sendButton) { - current = textArea.getText(); - cc.writeClientCutText(current, current.length()); + cc.writeClientCutText(textArea.getText(), textArea.getText().length()); endDialog(); } else if (s instanceof JButton && (JButton)s == cancelButton) { endDialog(); @@ -106,7 +101,6 @@ class ClipboardDialog extends Dialog implements ActionListener { } CConn cc; - String current; JTextArea textArea; JButton clearButton, sendButton, cancelButton; static LogWriter vlog = new LogWriter("ClipboardDialog"); diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java index 3657b03a..e1d242a6 100644 --- a/java/com/tigervnc/vncviewer/DesktopWindow.java +++ b/java/com/tigervnc/vncviewer/DesktopWindow.java @@ -357,30 +357,33 @@ class DesktopWindow extends JPanel implements Runnable, MouseListener, g2.dispose(); } - String oldContents = ""; - public synchronized void checkClipboard() { SecurityManager sm = System.getSecurityManager(); try { if (sm != null) sm.checkSystemClipboardAccess(); Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (cb != null && cc.viewer.sendClipboard.getValue()) { - Transferable t = cb.getContents(null); - if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) { - try { - String newContents = (String)t.getTransferData(DataFlavor.stringFlavor); - if (newContents != null && !newContents.equals(oldContents)) { + if (cb == null) return; + Transferable t = cb.getContents(null); + if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) { + try { + String newContents = new String(""); + if (t.getTransferData(DataFlavor.stringFlavor) != null) { + int len = Math.min(cc.viewer.maxCutText.getValue(), + ((String)t.getTransferData(DataFlavor.stringFlavor)).length()); + newContents = + ((String)t.getTransferData(DataFlavor.stringFlavor)).substring(0, len); + } + if (!newContents.equals(cc.clipboardDialog.getContents())) { + if (cc.viewer.sendClipboard.getValue()) cc.writeClientCutText(newContents, newContents.length()); - oldContents = newContents; - cc.clipboardDialog.setContents(newContents); - } - } catch(java.lang.Exception e) { - System.out.println("Exception getting clipboard data: " + e.getMessage()); + cc.clipboardDialog.setContents(newContents); } + } catch(java.lang.Exception e) { + vlog.debug("Exception getting clipboard data: " + e.getMessage()); } } } catch(SecurityException e) { - System.err.println("Cannot access the system clipboard"); + vlog.debug("Cannot access the system clipboard"); } } diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java index 9a015cfb..89bc94ed 100644 --- a/java/com/tigervnc/vncviewer/VncViewer.java +++ b/java/com/tigervnc/vncviewer/VncViewer.java @@ -460,6 +460,10 @@ public class VncViewer extends java.applet.Applet implements Runnable = new BoolParameter("SendClipboard", "Send clipboard changes to the server", true); + IntParameter maxCutText + = new IntParameter("MaxCutText", + "Maximum permitted length of an outgoing clipboard update", + 262144); StringParameter menuKey = new StringParameter("MenuKey", "The key which brings up the popup menu", -- 2.39.5