Revision: 4965 http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4965&view=rev Author: bphinz Date: 2012-08-26 20:52:15 +0000 (Sun, 26 Aug 2012) Log Message: ----------- Fix AccessControlException caused by using System.exit() in applet mode, and close viewer properly in several other cases.
Modified Paths: -------------- trunk/java/com/tigervnc/network/SocketDescriptor.java trunk/java/com/tigervnc/network/TcpListener.java trunk/java/com/tigervnc/network/TcpSocket.java trunk/java/com/tigervnc/rdr/Exception.java trunk/java/com/tigervnc/vncviewer/CConn.java trunk/java/com/tigervnc/vncviewer/F8Menu.java trunk/java/com/tigervnc/vncviewer/ServerDialog.java trunk/java/com/tigervnc/vncviewer/Viewport.java trunk/java/com/tigervnc/vncviewer/VncViewer.java Modified: trunk/java/com/tigervnc/network/SocketDescriptor.java =================================================================== --- trunk/java/com/tigervnc/network/SocketDescriptor.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/network/SocketDescriptor.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -49,6 +49,15 @@ } } + 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(); Modified: trunk/java/com/tigervnc/network/TcpListener.java =================================================================== --- trunk/java/com/tigervnc/network/TcpListener.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/network/TcpListener.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -62,8 +62,7 @@ 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 @@ 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); Modified: trunk/java/com/tigervnc/network/TcpSocket.java =================================================================== --- trunk/java/com/tigervnc/network/TcpSocket.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/network/TcpSocket.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -153,9 +153,9 @@ } public void shutdown() throws Exception { + super.shutdown(); try { - close(); - super.shutdown(); + ((SocketDescriptor)getFd()).shutdown(); } catch (IOException e) { throw new Exception(e.toString()); } Modified: trunk/java/com/tigervnc/rdr/Exception.java =================================================================== --- trunk/java/com/tigervnc/rdr/Exception.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/rdr/Exception.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -22,7 +22,6 @@ public class Exception extends RuntimeException { public Exception(String s) { super(s); - System.out.println(s); } } Modified: trunk/java/com/tigervnc/vncviewer/CConn.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/CConn.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/vncviewer/CConn.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -116,18 +116,16 @@ 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 @@ 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 @@ //////////////////////////////////////////////////////////////////// // 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 @@ // 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: Modified: trunk/java/com/tigervnc/vncviewer/F8Menu.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/F8Menu.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/vncviewer/F8Menu.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -85,7 +85,7 @@ 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)) { Modified: trunk/java/com/tigervnc/vncviewer/ServerDialog.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/ServerDialog.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/vncviewer/ServerDialog.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -44,8 +44,8 @@ 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(); Modified: trunk/java/com/tigervnc/vncviewer/Viewport.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/Viewport.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/vncviewer/Viewport.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -49,7 +49,7 @@ }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - cc.deleteWindow(); + cc.close(); } }); addComponentListener(new ComponentAdapter() { Modified: trunk/java/com/tigervnc/vncviewer/VncViewer.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/VncViewer.java 2012-08-26 20:35:30 UTC (rev 4964) +++ trunk/java/com/tigervnc/vncviewer/VncViewer.java 2012-08-26 20:52:15 UTC (rev 4965) @@ -108,8 +108,6 @@ public static void main(String[] argv) { setLookAndFeel(); VncViewer viewer = new VncViewer(argv); - viewer.firstApplet = true; - viewer.stop = false; viewer.start(); } @@ -138,7 +136,7 @@ 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 @@ " \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 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 @@ : ("::"+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 @@ 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 @@ 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 @@ Thread thread; Socket sock; - boolean applet, firstApplet, stop; + boolean applet; Image logo; static int nViewers; static LogWriter vlog = new LogWriter("main"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Tigervnc-commits mailing list Tigervnc-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tigervnc-commits