diff options
author | Brian Hinz <bphinz@users.sourceforge.net> | 2012-08-26 20:52:15 +0000 |
---|---|---|
committer | Brian Hinz <bphinz@users.sourceforge.net> | 2012-08-26 20:52:15 +0000 |
commit | 932fac573ab2f5a92c930e08de8aa9ddb98d4395 (patch) | |
tree | b74ab123c4625241066c5ac8250d3c2e6015296d | |
parent | 7e4488dce2eaf6b2d661aae890213500af9a5ba6 (diff) | |
download | tigervnc-932fac573ab2f5a92c930e08de8aa9ddb98d4395.tar.gz tigervnc-932fac573ab2f5a92c930e08de8aa9ddb98d4395.zip |
Fix AccessControlException caused by using System.exit() in applet mode, and close viewer properly in several other cases.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4965 3789f03b-4d11-0410-bbf8-ca57d06f2519
-rw-r--r-- | java/com/tigervnc/network/SocketDescriptor.java | 9 | ||||
-rw-r--r-- | java/com/tigervnc/network/TcpListener.java | 6 | ||||
-rw-r--r-- | java/com/tigervnc/network/TcpSocket.java | 4 | ||||
-rw-r--r-- | java/com/tigervnc/rdr/Exception.java | 1 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/CConn.java | 26 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/F8Menu.java | 2 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/ServerDialog.java | 4 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/Viewport.java | 2 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/VncViewer.java | 48 |
9 files changed, 50 insertions, 52 deletions
diff --git a/java/com/tigervnc/network/SocketDescriptor.java b/java/com/tigervnc/network/SocketDescriptor.java index 3517a99f..4c5a23af 100644 --- a/java/com/tigervnc/network/SocketDescriptor.java +++ b/java/com/tigervnc/network/SocketDescriptor.java @@ -49,6 +49,15 @@ public class SocketDescriptor implements FileDescriptor { } } + public void shutdown() throws IOException { + try { + channel.socket().shutdownInput(); + channel.socket().shutdownOutput(); + } catch(IOException e) { + throw new IOException(e.toString()); + } + } + public void close() throws IOException { try { channel.close(); diff --git a/java/com/tigervnc/network/TcpListener.java b/java/com/tigervnc/network/TcpListener.java index 959d5459..b7dc4384 100644 --- a/java/com/tigervnc/network/TcpListener.java +++ b/java/com/tigervnc/network/TcpListener.java @@ -62,8 +62,7 @@ public class TcpListener extends SocketListener { addr = InetAddress.getByName("0.0.0.0"); } } catch (UnknownHostException e) { - System.out.println(e.toString()); - System.exit(-1); + throw new Exception(e.toString()); } try { @@ -129,8 +128,7 @@ public class TcpListener extends SocketListener { try { fd = new SocketDescriptor(); } catch (java.lang.Exception e) { - System.out.println(e.toString()); - System.exit(-1); + throw new SocketException(e.toString()); } fd.setChannel(new_sock); TcpSocket s = new TcpSocket(fd); diff --git a/java/com/tigervnc/network/TcpSocket.java b/java/com/tigervnc/network/TcpSocket.java index ac53aaf7..cdc05016 100644 --- a/java/com/tigervnc/network/TcpSocket.java +++ b/java/com/tigervnc/network/TcpSocket.java @@ -153,9 +153,9 @@ public class TcpSocket extends Socket { } public void shutdown() throws Exception { + super.shutdown(); try { - close(); - super.shutdown(); + ((SocketDescriptor)getFd()).shutdown(); } catch (IOException e) { throw new Exception(e.toString()); } diff --git a/java/com/tigervnc/rdr/Exception.java b/java/com/tigervnc/rdr/Exception.java index 627b98d9..19977aac 100644 --- a/java/com/tigervnc/rdr/Exception.java +++ b/java/com/tigervnc/rdr/Exception.java @@ -22,7 +22,6 @@ package com.tigervnc.rdr; public class Exception extends RuntimeException { public Exception(String s) { super(s); - System.out.println(s); } } diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java index f4c75a2e..e3aea943 100644 --- a/java/com/tigervnc/vncviewer/CConn.java +++ b/java/com/tigervnc/vncviewer/CConn.java @@ -116,18 +116,16 @@ public class CConn extends CConnection String name = sock.getPeerEndpoint(); vlog.info("Accepted connection from "+name); } else { - if (vncServerName != null) { + if (vncServerName != null && + !viewer.alwaysShowServerDialog.getValue()) { serverHost = Hostname.getHost(vncServerName); serverPort = Hostname.getPort(vncServerName); } else { ServerDialog dlg = new ServerDialog(options, vncServerName, this); if (!dlg.showDialog() || dlg.server.getSelectedItem().equals("")) { - if (viewer.firstApplet) { - System.exit(1); - } else { - viewer.stop(); - return; - } + vlog.info("No server name specified!"); + close(); + return; } vncServerName = (String)dlg.server.getSelectedItem(); serverHost = Hostname.getHost(vncServerName); @@ -171,12 +169,6 @@ public class CConn extends CConnection if (viewport != null) viewport.dispose(); viewport = null; - if (viewer.firstApplet) { - System.exit(1); - } else { - close(); - viewer.stop(); - } } // blockCallback() is called when reading from the socket would block. @@ -691,11 +683,13 @@ public class CConn extends CConnection //////////////////////////////////////////////////////////////////// // The following methods are all called from the GUI thread - // close() closes the socket, thus waking up the RFB thread. + // close() shuts down the socket, thus waking up the RFB thread. public void close() { + deleteWindow(); shuttingDown = true; try { - sock.shutdown(); + if (sock != null) + sock.shutdown(); } catch (java.lang.Exception e) { throw new Exception(e.toString()); } @@ -1321,7 +1315,7 @@ public class CConn extends CConnection // shuttingDown is set by the GUI thread and only ever tested by the RFB // thread after the window has been destroyed. - boolean shuttingDown; + boolean shuttingDown = false; // reading and writing int and boolean is atomic in java, so no // synchronization of the following flags is needed: diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java index b346db95..5d804b5b 100644 --- a/java/com/tigervnc/vncviewer/F8Menu.java +++ b/java/com/tigervnc/vncviewer/F8Menu.java @@ -85,7 +85,7 @@ public class F8Menu extends JPopupMenu implements ActionListener { public void actionPerformed(ActionEvent ev) { if (actionMatch(ev, exit)) { - cc.deleteWindow(); + cc.close(); } else if (actionMatch(ev, fullScreen)) { cc.toggleFullScreen(); } else if (actionMatch(ev, restore)) { diff --git a/java/com/tigervnc/vncviewer/ServerDialog.java b/java/com/tigervnc/vncviewer/ServerDialog.java index b331d7a2..b596dbfd 100644 --- a/java/com/tigervnc/vncviewer/ServerDialog.java +++ b/java/com/tigervnc/vncviewer/ServerDialog.java @@ -44,8 +44,8 @@ class ServerDialog extends Dialog implements setTitle("VNC Viewer : Connection Details"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - if (cc.viewer.firstApplet && cc.viewport == null) { - System.exit(1); + if (cc.viewer.nViewers == 1) { + cc.viewer.exit(1); } else { ok = false; endDialog(); diff --git a/java/com/tigervnc/vncviewer/Viewport.java b/java/com/tigervnc/vncviewer/Viewport.java index 680a02d3..de3621c2 100644 --- a/java/com/tigervnc/vncviewer/Viewport.java +++ b/java/com/tigervnc/vncviewer/Viewport.java @@ -49,7 +49,7 @@ public class Viewport extends JFrame }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - cc.deleteWindow(); + cc.close(); } }); addComponentListener(new ComponentAdapter() { diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java index b2fbee5c..acbdb7f2 100644 --- a/java/com/tigervnc/vncviewer/VncViewer.java +++ b/java/com/tigervnc/vncviewer/VncViewer.java @@ -108,8 +108,6 @@ public class VncViewer extends java.applet.Applet implements Runnable public static void main(String[] argv) { setLookAndFeel(); VncViewer viewer = new VncViewer(argv); - viewer.firstApplet = true; - viewer.stop = false; viewer.start(); } @@ -138,7 +136,7 @@ public class VncViewer extends java.applet.Applet implements Runnable if (argv[i].equalsIgnoreCase("-tunnel") || argv[i].equalsIgnoreCase("-via")) { if (!tunnel.createTunnel(argv.length, argv, i)) - System.exit(1); + exit(1); if (argv[i].equalsIgnoreCase("-via")) i++; continue; } @@ -242,22 +240,22 @@ public class VncViewer extends java.applet.Applet implements Runnable " \t%R remote TCP port number.\n"+ "\n"); System.err.print(propertiesString); + // Technically, we shouldn't use System.exit here but if there is a parameter + // error then the problem is in the index/html file anyway. System.exit(1); } public VncViewer() { applet = true; - firstApplet = true; } public static void newViewer(VncViewer oldViewer, Socket sock, boolean close) { VncViewer viewer = new VncViewer(); viewer.applet = oldViewer.applet; - viewer.firstApplet = (close) ? true : false; viewer.sock = sock; viewer.start(); if (close) - oldViewer.stop(); + oldViewer.exit(0); } public static void newViewer(VncViewer oldViewer, Socket sock) { @@ -295,8 +293,7 @@ public class VncViewer extends java.applet.Applet implements Runnable public void start() { vlog.debug("start called"); getTimestamp(); - nViewers++; - if (applet && firstApplet) { + if (applet && nViewers == 0) { alwaysShowServerDialog.setParam(true); Configuration.global().readAppletParams(this); String host = getCodeBase().getHost(); @@ -307,12 +304,20 @@ public class VncViewer extends java.applet.Applet implements Runnable : ("::"+port))); } } + nViewers++; thread = new Thread(this); thread.start(); } - public void stop() { - stop = true; + public void exit(int n) { + nViewers--; + if (nViewers > 0) + return; + if (applet) { + destroy(); + } else { + System.exit(n); + } } public void paint(Graphics g) { @@ -337,7 +342,7 @@ public class VncViewer extends java.applet.Applet implements Runnable listener = new TcpListener(null, port); } catch (java.lang.Exception e) { System.out.println(e.toString()); - System.exit(1); + exit(1); } vlog.info("Listening on port "+port); @@ -351,29 +356,22 @@ public class VncViewer extends java.applet.Applet implements Runnable try { cc = new CConn(this, sock, vncServerName.getValue()); - while (!stop) + while (!cc.shuttingDown) cc.processMsg(); - if (nViewers > 1) { - cc = null; - return; - } - } catch (EndOfStream e) { - vlog.info(e.toString()); } catch (java.lang.Exception e) { - if (cc != null) cc.deleteWindow(); if (cc == null || !cc.shuttingDown) { e.printStackTrace(); JOptionPane.showMessageDialog(null, e.toString(), "VNC Viewer : Error", JOptionPane.ERROR_MESSAGE); + } else { + if (!cc.shuttingDown) + vlog.info(e.toString()); + cc = null; } } - if (cc != null) cc.deleteWindow(); - nViewers--; - if (!applet && nViewers == 0) { - System.exit(0); - } + exit(0); } BoolParameter useLocalCursor @@ -536,7 +534,7 @@ public class VncViewer extends java.applet.Applet implements Runnable Thread thread; Socket sock; - boolean applet, firstApplet, stop; + boolean applet; Image logo; static int nViewers; static LogWriter vlog = new LogWriter("main"); |