]> source.dussan.org Git - tigervnc.git/commitdiff
Fix AccessControlException caused by using System.exit() in applet mode, and close...
authorBrian Hinz <bphinz@users.sourceforge.net>
Sun, 26 Aug 2012 20:52:15 +0000 (20:52 +0000)
committerBrian Hinz <bphinz@users.sourceforge.net>
Sun, 26 Aug 2012 20:52:15 +0000 (20:52 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4965 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/com/tigervnc/network/SocketDescriptor.java
java/com/tigervnc/network/TcpListener.java
java/com/tigervnc/network/TcpSocket.java
java/com/tigervnc/rdr/Exception.java
java/com/tigervnc/vncviewer/CConn.java
java/com/tigervnc/vncviewer/F8Menu.java
java/com/tigervnc/vncviewer/ServerDialog.java
java/com/tigervnc/vncviewer/Viewport.java
java/com/tigervnc/vncviewer/VncViewer.java

index 3517a99f0917549bf04c8ebf893999ff130680e0..4c5a23afe6816ba06befb3f7769e818b39a01ad6 100644 (file)
@@ -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();
index 959d5459d6e33a47316355ba92c8387cf74f5584..b7dc4384af4ecf5be6892e6661cbab43bb89dfc9 100644 (file)
@@ -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);
index ac53aaf787a4249fc751bba12a99d3087b2740b6..cdc05016a9c2987826646d13c4bcd603876864c7 100644 (file)
@@ -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());
     }
index 627b98d91ca097d0d343008e08819cd6976b8859..19977aacb3020118f9fcbf4302b711d468239dd0 100644 (file)
@@ -22,7 +22,6 @@ package com.tigervnc.rdr;
 public class Exception extends RuntimeException {
   public Exception(String s) {
     super(s);
-    System.out.println(s);
   }
 }
 
index f4c75a2e3a704adb87068ca4a6901d079e00e545..e3aea9430f1c434b41b1b46e6c58287428e37b23 100644 (file)
@@ -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:
index b346db951229824f25b816eddf56e88c41200d0c..5d804b5ba25e9f071b4ff33d45d9872d47b77991 100644 (file)
@@ -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)) {
index b331d7a233b3e1c66af240907259b11123d4abbb..b596dbfd9de38a3096a2f014ff5b28e418c52cc6 100644 (file)
@@ -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();
index 680a02d3e0dbf999044fcf12ab2306b56afdbcac..de3621c21e25c6cd6e0cf281ee48b237df3d8389 100644 (file)
@@ -49,7 +49,7 @@ public class Viewport extends JFrame
     });
     addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
-        cc.deleteWindow();
+        cc.close();
       }
     });
     addComponentListener(new ComponentAdapter() {
index b2fbee5c2b7d6ffdd14fb882e8e721dc24a0acd5..acbdb7f2d8fc38b1739284613b2a6903b43a4b4d 100644 (file)
@@ -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");