[ http://issues.apache.org/jira/browse/DERBY-1598?page=all ]
Andreas Korneliussen closed DERBY-1598. --------------------------------------- Resolution: Duplicate Duplicate: http://issues.apache.org/jira/browse/DERBY-1241 > unable to boot exisiting database from network server when running with > security manager > ---------------------------------------------------------------------------------------- > > Key: DERBY-1598 > URL: http://issues.apache.org/jira/browse/DERBY-1598 > Project: Derby > Issue Type: Bug > Components: Store > Affects Versions: 10.2.0.0 > Reporter: Andreas Korneliussen > Priority: Blocker > > Myrna van Lunteren reported the following: > ====Quote============ > I ran into the following interesting situation with permissions > granted as per derby_tests.policy, and I'm hoping someone can answer > my questions: > - start networkserver with derby_tests.policy as described in the > remote server testing section of the java/testing/README.htm, but with > -h <srvhostname> > - start an ij session, connect to the server creating a database > - disconnect, exit ij, shutdown networkserver > so far ok > - start networkserver again just like before > - start ij again just like before, connect to the same database again > results in: > ERROR XJ040: DERBY SQL error: SQLCODE: -1, SQLSTATE: XJ040, SQLERRMC: > Failed to start database 'bladb', see the next exception for > details.::SQLSTATE: XJ001Java exception: 'access denied > (java.io.FilePermission > /home/myrna/tsttmp5/srv/bladb/log/logmirror.ctrl read): > java.security.AccessControlException'. > One can dis- and reconnect fine as long as the network server is up, > but once it has been bounced, reconnect fails. > derby.log shows no stack trace, even though the following properties > are set in derby.properties in derby.system.home: > derby.infolog.append=true > derby.language.logStatementText=true > derby.stream.error.logSeverityLevel=0 > ------------------ > ... > 2006-07-26 23:49:38.402 GMT Thread[DRDAConnThread_3,5,main] (DATABASE > = bladb), (DRDAID = {1}), Failed to start database 'bladb', see the > next exception for details. > 2006-07-26 23:49:38.404 GMT Thread[DRDAConnThread_3,5,main] (DATABASE > = bladb), (DRDAID = {1}), Java exception: 'access denied > (java.io.FilePermission > /home/myrna/tsttmp5/srv/bladb/log/logmirror.ctrl read): > java.security.AccessControlException'. > ---------------- > The error goes away when I add the following permissions to derbynet.jar: > // all databases under derby.system.home > permission java.io.FilePermission "${derby.system.home}${/}-", > "read, write, delete"; > ====End Quote ============ > I have reproduced this problem manually. After adding some tracing calls in > ..drda.Database.makeConnection() I got this stack trace: > java.sql.SQLException: Failed to start database > '/export/home/tmp/devel/derbydev/testing/testdb', see the next exception for > details. > at > org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:44) > at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:88) > at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:94) > at > org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:173) > at > org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(EmbedConnection.java:1955) > at > org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(EmbedConnection.java:1619) > at > org.apache.derby.impl.jdbc.EmbedConnection.<init>(EmbedConnection.java:216) > at > org.apache.derby.impl.jdbc.EmbedConnection30.<init>(EmbedConnection30.java:72) > at > org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Driver30.java:73) > at > org.apache.derby.jdbc.InternalDriver.connect(InternalDriver.java:209) > at > org.apache.derby.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:116) > at > org.apache.derby.impl.drda.Database.makeConnection(Database.java:232) > at > org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(DRDAConnThread.java:1191) > at > org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(DRDAConnThread.java:1169) > at > org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(DRDAConnThread.java:2758) > at > org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(DRDAConnThread.java:1031) > at > org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:874) > at > org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:254) > NEXT Exception follows > java.security.AccessControlException: access denied (java.io.FilePermission > /export/home/tmp/devel/derbydev/testing/testdb/log/logmirror.ctrl read) > at > java.security.AccessControlContext.checkPermission(AccessControlContext.java:269) > at > java.security.AccessController.checkPermission(AccessController.java:401) > at java.lang.SecurityManager.checkPermission(SecurityManager.java:524) > at java.lang.SecurityManager.checkRead(SecurityManager.java:863) > at java.io.File.exists(File.java:678) > at > org.apache.derby.impl.store.raw.log.LogToFile.boot(LogToFile.java:2987) > at > org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:1996) > at > org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:290) > at > org.apache.derby.impl.services.monitor.BaseMonitor.startModule(BaseMonitor.java:542) > at > org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Monitor.java:418) > at > org.apache.derby.impl.store.raw.data.BaseDataFileFactory.bootLogFactory(BaseDataFileFactory.java:1761) > at > org.apache.derby.impl.store.raw.data.BaseDataFileFactory.setRawStoreFactory(BaseDataFileFactory.java:1217) > at org.apache.derby.impl.store.raw.RawStore.boot(RawStore.java:373) > at > org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:1996) > at > org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:290) > at > org.apache.derby.impl.services.monitor.BaseMonitor.startModule(BaseMonitor.java:542) > at > org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Monitor.java:418) > at > org.apache.derby.impl.store.access.RAMAccessManager.boot(RAMAccessManager.java:987) > at > org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:1996) > at > org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:290) > at > org.apache.derby.impl.services.monitor.BaseMonitor.startModule(BaseMonitor.java:542) > at > org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Monitor.java:418) > at > org.apache.derby.impl.db.BasicDatabase.bootStore(BasicDatabase.java:738) > at org.apache.derby.impl.db.BasicDatabase.boot(BasicDatabase.java:178) > at > org.apache.derby.impl.services.monitor.BaseMonitor.boot(BaseMonitor.java:1996) > at > org.apache.derby.impl.services.monitor.TopService.bootModule(TopService.java:290) > at > org.apache.derby.impl.services.monitor.BaseMonitor.bootService(BaseMonitor.java:1831) > at > org.apache.derby.impl.services.monitor.BaseMonitor.startProviderService(BaseMonitor.java:1697) > at > org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(BaseMonitor.java:1577) > at > org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(BaseMonitor.java:990) > at > org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Monitor.java:541) > at > org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(EmbedConnection.java:1602) > at > org.apache.derby.impl.jdbc.EmbedConnection.<init>(EmbedConnection.java:216) > at > org.apache.derby.impl.jdbc.EmbedConnection30.<init>(EmbedConnection30.java:72) > at > org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Driver30.java:73) > at > org.apache.derby.jdbc.InternalDriver.connect(InternalDriver.java:209) > at > org.apache.derby.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:116) > at > org.apache.derby.impl.drda.Database.makeConnection(Database.java:232) > at > org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(DRDAConnThread.java:1191) > at > org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(DRDAConnThread.java:1169) > at > org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(DRDAConnThread.java:2758) > at > org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(DRDAConnThread.java:1031) > at > org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:874) > at > org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:254) > It seems like the method org.apache.derby.impl.store.raw.log.LogToFile.boot > calls File.exists() directly, instead of doing it in a privileged block. > So, a fix could possibly be to use privExists(..) as below: > Index: LogToFile.java > =================================================================== > --- LogToFile.java (revision 425403) > +++ LogToFile.java (working copy) > @@ -2985,7 +2985,7 @@ > } > > if (checkpointInstant == > LogCounter.INVALID_LOG_INSTANT && > - > getMirrorControlFileName().exists()) > + > privExists(getMirrorControlFileName())) > { > checkpointInstant = > readControlFile( > I have tested that running with this, I did not get the security exception. > However, I have not run any other tests on the proposed patch. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira