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
diff --git a/java/com/tigervnc/vncviewer/ClipboardDialog.java b/java/com/tigervnc/vncviewer/ClipboardDialog.java
index d6e2525..2c9b7d0 100644
--- a/java/com/tigervnc/vncviewer/ClipboardDialog.java
+++ b/java/com/tigervnc/vncviewer/ClipboardDialog.java
@@ -57,15 +57,12 @@
pack();
}
- public void initDialog() {
- textArea.setText(current);
- textArea.selectAll();
+ public void setContents(String str) {
+ textArea.setText(str);
}
- 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 @@
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 @@
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 @@
}
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 3657b03..e1d242a 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -357,30 +357,33 @@
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)) {
- 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());
+ 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());
+ 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 9a015cf..89bc94e 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -460,6 +460,10 @@
= 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",