You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by co...@apache.org on 2001/07/22 17:44:11 UTC

cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs ExecuteJava.java Java.java

conor       01/07/22 08:44:11

  Modified:    src/main/org/apache/tools/ant Main.java
               src/main/org/apache/tools/ant/taskdefs ExecuteJava.java
                        Java.java
  Added:       src/main/org/apache/tools/ant ExitException.java
  Log:
  Add a security manager so that non-forked java programs that call
  System.exit() work
  
  Revision  Changes    Path
  1.40      +12 -2     jakarta-ant/src/main/org/apache/tools/ant/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Main.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- Main.java	2001/07/22 13:12:28	1.39
  +++ Main.java	2001/07/22 15:44:10	1.40
  @@ -402,7 +402,7 @@
               System.out.println("Buildfile: " + buildFile);
           }
   
  -        Project project = new Project();
  +        final Project project = new Project();
           project.setSystemLoader(systemLoader);
           
           Throwable error = null;
  @@ -412,7 +412,16 @@
   
               PrintStream err = System.err;
               PrintStream out = System.out;
  -            
  +            SecurityManager oldsm = System.getSecurityManager();
  +            System.setSecurityManager(new SecurityManager() {
  +                                        public void checkExit(int status) {
  +                                            throw new ExitException(status);
  +                                        }
  +                                        
  +                                        public void checkPermission(java.security.Permission p) {
  +                                        }
  +                                    });
  +
               try {
                   System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
                   System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
  @@ -455,6 +464,7 @@
               finally {
                   System.setOut(out);
                   System.setErr(err);
  +                System.setSecurityManager(oldsm);
               }
               if (projectHelp) {
                       printTargets(project);
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/ExitException.java
  
  Index: ExitException.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.tools.ant;
  
  /**
   * Used to report exit status of classes which call System.exit()
   *
   * @author Conor MacNeill
   */
  public class ExitException extends SecurityException {
  
      private int status;
      
      /**
       * Constructs an exit exception.
       */
      public ExitException(int status) {
          super("ExitException: status " + status);
          this.status = status;
      }
  
      public int getStatus() {
          return status;
      }
  }
  
  
  
  1.15      +4 -2      jakarta-ant/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java
  
  Index: ExecuteJava.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ExecuteJava.java	2001/07/22 13:12:29	1.14
  +++ ExecuteJava.java	2001/07/22 15:44:11	1.15
  @@ -57,6 +57,7 @@
   
   import org.apache.tools.ant.AntClassLoader;
   import org.apache.tools.ant.BuildException;
  +import org.apache.tools.ant.ExitException;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.types.Commandline;
   import org.apache.tools.ant.types.CommandlineJava;
  @@ -130,8 +131,9 @@
               if (!(t instanceof SecurityException)) {
                   throw new BuildException(t);
               }
  -            // else ignore because the security exception is thrown
  -            // if the invoked application tried to call System.exit()
  +            else {
  +                throw (SecurityException)t;
  +            }
           } catch (Exception e) {
               throw new BuildException(e);
           } finally {
  
  
  
  1.27      +8 -2      jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Java.java
  
  Index: Java.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Java.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- Java.java	2001/07/22 13:12:29	1.26
  +++ Java.java	2001/07/22 15:44:11	1.27
  @@ -55,6 +55,7 @@
   package org.apache.tools.ant.taskdefs;
   
   import org.apache.tools.ant.BuildException;
  +import org.apache.tools.ant.ExitException;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.Task;
   import org.apache.tools.ant.types.*;
  @@ -120,8 +121,13 @@
   
               log("Running in same VM " + cmdl.getJavaCommand().toString(), 
                   Project.MSG_VERBOSE);
  -            run(cmdl);
  -            return 0;
  +            try {
  +                run(cmdl);
  +                return 0;
  +            }
  +            catch (ExitException ex) {
  +                return ex.getStatus();
  +            }
           }
       }