You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2013/06/20 16:54:21 UTC

svn commit: r1495035 - in /db/derby/code/branches/10.8: ./ java/client/org/apache/derby/client/net/ java/drda/org/apache/derby/impl/drda/ java/engine/org/apache/derby/jdbc/ java/engine/org/apache/derby/loc/ java/shared/org/apache/derby/shared/common/re...

Author: kahatlen
Date: Thu Jun 20 14:54:20 2013
New Revision: 1495035

URL: http://svn.apache.org/r1495035
Log:
DERBY-6224: Many test failures on latest JDK 8 EA build because of missing SQLPermission

Merged revisions 1490291 and 1494947 from 10.9.

Added:
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/ShutdownWithoutDeregisterPermissionTest.java
      - copied unchanged from r1494947, db/derby/code/branches/10.9/java/testing/org/apache/derbyTesting/functionTests/tests/engine/ShutdownWithoutDeregisterPermissionTest.java
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/noDeregisterPermission.policy
      - copied unchanged from r1494947, db/derby/code/branches/10.9/java/testing/org/apache/derbyTesting/functionTests/tests/engine/noDeregisterPermission.policy
Modified:
    db/derby/code/branches/10.8/   (props changed)
    db/derby/code/branches/10.8/java/client/org/apache/derby/client/net/NetCursor.java   (props changed)
    db/derby/code/branches/10.8/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java
    db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/AutoloadedDriver.java
    db/derby/code/branches/10.8/java/engine/org/apache/derby/loc/messages.xml
    db/derby/code/branches/10.8/java/shared/org/apache/derby/shared/common/reference/MessageId.java
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/ServerPropertiesTest.policy
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/_Suite.java
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/build.xml
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy

Propchange: db/derby/code/branches/10.8/
------------------------------------------------------------------------------
  Merged /db/derby/code/branches/10.9:r1490291,1494947
  Merged /db/derby/code/trunk:r1488125,1493077
  Merged /db/derby/code/branches/10.10:r1494758,1494888

Propchange: db/derby/code/branches/10.8/java/client/org/apache/derby/client/net/NetCursor.java
------------------------------------------------------------------------------
  Merged /db/derby/code/branches/10.9/java/client/org/apache/derby/client/net/NetCursor.java:r1490291,1494947

Modified: db/derby/code/branches/10.8/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java (original)
+++ db/derby/code/branches/10.8/java/drda/org/apache/derby/impl/drda/NetworkServerControlImpl.java Thu Jun 20 14:54:20 2013
@@ -910,7 +910,14 @@ public final class NetworkServerControlI
 						if (passwordArg != null) {
 							p.setProperty("password", passwordArg);
 						}
-						cloudscapeDriver.connect("jdbc:derby:;shutdown=true", p);
+                        // DERBY-6224: DriverManager.deregisterDriver() requires
+                        // an extra permission in JDBC 4.2 and later. Invoke
+                        // system shutdown with deregister=false to avoid the
+                        // need for the extre permission in the default server
+                        // policy. Since the JVM is about to terminate, we don't
+                        // care whether the JDBC driver is deregistered.
+                        cloudscapeDriver.connect(
+                            "jdbc:derby:;shutdown=true;deregister=false", p);
 					}
 				} catch (SQLException sqle) {
 					// If we can't shutdown Derby, perhaps, authentication has

Modified: db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/AutoloadedDriver.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/AutoloadedDriver.java?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/AutoloadedDriver.java (original)
+++ db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/AutoloadedDriver.java Thu Jun 20 14:54:20 2013
@@ -27,14 +27,16 @@ import java.sql.Connection;
 import java.sql.DriverPropertyInfo;
 import java.sql.SQLException;
 
-import java.io.PrintStream;
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Properties;
 
 import org.apache.derby.iapi.reference.MessageId;
-import org.apache.derby.iapi.reference.Attribute;
 import org.apache.derby.iapi.services.i18n.MessageService;
 import org.apache.derby.iapi.services.sanity.SanityManager;
-import org.apache.derby.iapi.jdbc.JDBCBoot;
+import org.apache.derby.iapi.services.monitor.Monitor;
 
 
 /**
@@ -62,7 +64,7 @@ public class AutoloadedDriver implements
 	
 
     // This is the driver that memorizes the autoloadeddriver (DERBY-2905)
-    private static Driver _autoloadedDriver;
+    private static AutoloadedDriver _autoloadedDriver;
 
     // This flag is true unless the deregister attribute has been set to
     // false by the user (DERBY-2905)
@@ -249,20 +251,47 @@ public class AutoloadedDriver implements
         try {
             // deregister is false if user set deregister=false attribute (DERBY-2905)
             if (deregister && _autoloadedDriver != null) {
-                DriverManager.deregisterDriver(_autoloadedDriver);
+                deregisterDriver(_autoloadedDriver);
                 _autoloadedDriver = null;
-            } else {
-                DriverManager.deregisterDriver(_driverModule);
-                //DERBY 5085, need to restore the default value
-                deregister = true;
             }
+
+            // DERBY-5085, need to restore the default value
+            deregister = true;
+
             _driverModule = null;
         } catch (SQLException e) {
             if (SanityManager.DEBUG)
                 SanityManager.THROWASSERT(e);
         }
 	}
-	
+
+    private static void deregisterDriver(final AutoloadedDriver driver)
+            throws SQLException {
+        // DERBY-6224: DriverManager.deregisterDriver() requires a special
+        // permission in JDBC 4.2 and later. Call it in a privileged block
+        // so that the permission doesn't have to be granted to code that
+        // invokes engine shutdown.
+        try {
+            AccessController.doPrivileged(
+                    new PrivilegedExceptionAction() {
+                public Object run() throws SQLException {
+                    // Requires SQLPermission("deregisterDriver")
+                    DriverManager.deregisterDriver(driver);
+                    return null;
+                }
+            });
+        } catch (PrivilegedActionException pae) {
+            throw (SQLException) pae.getCause();
+        } catch (AccessControlException ace) {
+            // Since no permission was needed for deregisterDriver() before
+            // Java 8, applications may be surprised to find that engine
+            // shutdown fails because of it. For backward compatibility,
+            // don't fail shutdown if the permission is missing. Instead,
+            // log a message saying the driver could not be deregistered.
+            Monitor.logTextMessage(MessageId.CONN_DEREGISTER_NOT_PERMITTED);
+            Monitor.logThrowable(ace);
+        }
+    }
 
 	/*
 	** Return true if the engine has been booted.

Modified: db/derby/code/branches/10.8/java/engine/org/apache/derby/loc/messages.xml
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/engine/org/apache/derby/loc/messages.xml?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/engine/org/apache/derby/loc/messages.xml (original)
+++ db/derby/code/branches/10.8/java/engine/org/apache/derby/loc/messages.xml Thu Jun 20 14:54:20 2013
@@ -7955,6 +7955,11 @@ Shutting down instance {0} on database d
                 <text>There was an XA transaction associated with the connection being closed. The transaction is going to be rolled back. The transaction Xid is {0}.</text>
                 <arg>transactionXid</arg>
             </msg>
+
+            <msg>
+                <name>J137</name>
+                <text>Could not deregister the JDBC driver when shutting down the Derby engine. Make sure SQLPermission("deregisterDriver") is granted to derby.jar.</text>
+            </msg>
         </family>
 
 

Modified: db/derby/code/branches/10.8/java/shared/org/apache/derby/shared/common/reference/MessageId.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/shared/org/apache/derby/shared/common/reference/MessageId.java?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/shared/org/apache/derby/shared/common/reference/MessageId.java (original)
+++ db/derby/code/branches/10.8/java/shared/org/apache/derby/shared/common/reference/MessageId.java Thu Jun 20 14:54:20 2013
@@ -174,6 +174,9 @@ public interface MessageId {
     String CONN_XA_TRANSACTION_TIMED_OUT                    = "J135";
     String CONN_CLOSE_XA_TRANSACTION_ROLLED_BACK            = "J136";
 
+    /** Shutdown couldn't deregister driver because of missing permission. */
+    String CONN_DEREGISTER_NOT_PERMITTED = "J137";
+
 	/*
 	** Authentication
 	*/

Modified: db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/ServerPropertiesTest.policy
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/ServerPropertiesTest.policy?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/ServerPropertiesTest.policy (original)
+++ db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/ServerPropertiesTest.policy Thu Jun 20 14:54:20 2013
@@ -88,6 +88,10 @@ grant codeBase "${derbyTesting.codejar}d
   // might not be unregistered from the MBean server. See DERBY-3561.
   permission javax.management.MBeanPermission "org.apache.derby.*#[org.apache.derby:*]","unregisterMBean";
 
+
+  // This permission is needed to call DriverManager.deregisterDriver()
+  // on Java SE 8 and later.
+  permission java.sql.SQLPermission "deregisterDriver";
 };
 
 //
@@ -227,6 +231,10 @@ grant codeBase "${derbyTesting.codeclass
   // may be testing JMX functionality. Without this permission, old MBeans
   // might not be unregistered from the MBean server. See DERBY-3561.
   permission javax.management.MBeanPermission "org.apache.derby.*#[org.apache.derby:*]","unregisterMBean";
+
+  // This permission is needed to call DriverManager.deregisterDriver()
+  // on Java SE 8 and later.
+  permission java.sql.SQLPermission "deregisterDriver";
 };
 
 // JUnit jar file tries to read junit.properties in the user's

Modified: db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/_Suite.java?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/_Suite.java (original)
+++ db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/_Suite.java Thu Jun 20 14:54:20 2013
@@ -24,6 +24,7 @@ package org.apache.derbyTesting.function
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.apache.derbyTesting.junit.BaseTestCase;
+import org.apache.derbyTesting.junit.JDBC;
 
 /**
  * Suite to run all JUnit tests in this package:
@@ -49,6 +50,10 @@ public class _Suite extends BaseTestCase
         suite.addTest(ErrorStreamTest.suite());
         suite.addTest(LockInterruptTest.suite());
         suite.addTest(ModuleLoadingTest.suite());
+        if (JDBC.vmSupportsJDBC3()) {
+            // Test that requires DriverManager.
+            suite.addTest(ShutdownWithoutDeregisterPermissionTest.suite());
+        }
 
         return suite;
     }

Modified: db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/build.xml
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/build.xml?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/build.xml (original)
+++ db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/engine/build.xml Thu Jun 20 14:54:20 2013
@@ -65,7 +65,7 @@
     <mkdir dir="${out.dir}/${derby.testing.functest.dir}/tests/engine"/>
   </target>
 
-  <target name="compilet1" >
+  <target name="compilet1" depends="compile_jdk14">
      <javac
         source="1.4"
         target="1.4"
@@ -84,9 +84,33 @@
            <pathelement path="${junit}"/>
         </classpath>
         <include name="${this.dir}/*.java"/>
+        <exclude name="${this.dir}/ShutdownWithoutDeregisterPermissionTest.java"/>
      </javac>
   </target>
 
+  <target name="compile_jdk14">
+     <javac
+        source="1.4"
+        target="1.4"
+        bootclasspath="${empty}"
+        nowarn="on"
+        debug="true"
+        depend="${depend}"
+        deprecation="${deprecation}"
+        optimize="${optimize}"
+        proceed="${proceed}"
+        verbose="${verbose}"
+        srcdir="${derby.testing.src.dir}"
+        destdir="${out.dir}">
+        <classpath>
+           <pathelement path="${java14compile.classpath}"/>
+           <pathelement path="${junit}"/>
+        </classpath>
+        <include name="${this.dir}/ShutdownWithoutDeregisterPermissionTest.java"/>
+     </javac>
+  </target>
+
+
   <target name="copyfiles">
     <copy todir="${out.dir}/${derby.testing.functest.dir}/tests/engine">
       <fileset dir="${derby.testing.src.dir}/${derby.testing.functest.dir}/tests/engine"

Modified: db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy?rev=1495035&r1=1495034&r2=1495035&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy (original)
+++ db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/util/derby_tests.policy Thu Jun 20 14:54:20 2013
@@ -136,6 +136,10 @@ grant codeBase "${derbyTesting.codejar}d
 
   // This permission is needed to call the Connection.abort(Executor) method added by JDBC 4.1
   permission java.sql.SQLPermission "callAbort";
+
+  // This permission is needed to call DriverManager.deregisterDriver()
+  // on Java SE 8 and later.
+  permission java.sql.SQLPermission "deregisterDriver";
 };
 
 //
@@ -335,6 +339,9 @@ grant codeBase "${derbyTesting.codeclass
   permission org.apache.derby.security.SystemPermission "jmx", "control";
   permission org.apache.derby.security.SystemPermission "engine", "monitor";
   permission org.apache.derby.security.SystemPermission "server", "control,monitor";
+  // This permission is needed to call DriverManager.deregisterDriver()
+  // on Java SE 8 and later.
+  permission java.sql.SQLPermission "deregisterDriver";
 };
 
 // JUnit jar file tries to read junit.properties in the user's