[
https://issues.apache.org/jira/browse/FELIX-5204?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15175719#comment-15175719
]
Guillaume Nodet commented on FELIX-5204:
----------------------------------------
We use the Mina SSHD server in Karaf.
The problem happens when we restart the framework without restarting the JVM.
The reason is that the javax.crypto package has some internal cache about
Cipher providers. The providers are cached by the protection domain source
code url.
See
http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/classes/javax/crypto/JceSecurityManager.java#l79
Here's what happens:
* the JVM starts, the OSGi framework starts, the SSH bundle is installed with
a {{mvn:org.apache.sshd/sshd-core/1.0.0}} url (the url handler is an OSGi url
handler, so provided by a pax-url bundle)
* when the SSH server starts, the JceSecurityManager caches the Cipher
provider with this url
* the framework is restarted
* when the SSH server starts again, the JceSecurityManager calls {{get}} on
the cache indexed by the URL, but the URL in the cache is no longer valid and
the {{URLHandlersStreamHandlerProxy.equals}} throws the exception indicated
This obviously only happen when the bundle is installed with a
{{mvn:org.apache.sshd/sshd-core/1.0.0}} and not a
{{file:system/org/apache/sshd/sshd-core/1.0.0/sshd-core-1.0.0.jar}} url.
I think it's a bad idea that the BundleProtectionDomain uses a URL which may
not be valid after the framework is shutdown. My initial thinking was to use
the jar bundle revision path instead, something like
{{file:data/cache/bundle32/11.0/bundle.jar}}.
It seems that's the way Equinox works fwiw.
Especially, if the bundle is updated, I think the 2 code source should be
different, and using the original location used to install / update the url
does not bring this guarantee. Using the bundle revision instead seems cleaner
to me.
> IllegalStateException when using custom URL handlers for bundles
> ----------------------------------------------------------------
>
> Key: FELIX-5204
> URL: https://issues.apache.org/jira/browse/FELIX-5204
> Project: Felix
> Issue Type: Bug
> Components: Framework
> Affects Versions: framework-5.4.0
> Reporter: Guillaume Nodet
> Assignee: Guillaume Nodet
> Fix For: framework-5.6.0
>
>
> The following exception can happen after having restarted the whole framework.
> {code}
> java.lang.IllegalStateException: Stream handler unavailable.
> at
> org.apache.felix.framework.URLHandlersStreamHandlerProxy.getDefaultPort(URLHandlersStreamHandlerProxy.java:180)
> at java.net.URLStreamHandler.sameFile(URLStreamHandler.java:407)
> at
> org.osgi.service.url.AbstractURLStreamHandlerService.sameFile(AbstractURLStreamHandlerService.java:131)
> at java.net.URLStreamHandler.equals(URLStreamHandler.java:333)
> at
> org.osgi.service.url.AbstractURLStreamHandlerService.equals(AbstractURLStreamHandlerService.java:81)
> at
> org.apache.felix.framework.URLHandlersStreamHandlerProxy.equals(URLHandlersStreamHandlerProxy.java:163)
> at java.net.URL.equals(URL.java:870)
> at
> java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:940)
> at
> javax.crypto.JceSecurityManager.getCryptoPermission(JceSecurityManager.java:124)
> at javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2587)
> at javax.crypto.Cipher.initCryptoPermission(Cipher.java:700)
> at javax.crypto.Cipher.chooseProvider(Cipher.java:863)
> at javax.crypto.Cipher.init(Cipher.java:1396)
> at javax.crypto.Cipher.init(Cipher.java:1327)
> at org.apache.sshd.common.cipher.BaseCipher.init(BaseCipher.java:60)
> at org.apache.karaf.shell.ssh.SshUtils.buildCiphers(SshUtils.java:89)
> at
> org.apache.karaf.shell.ssh.Activator.createSshServer(Activator.java:183)
> at org.apache.karaf.shell.ssh.Activator.doStart(Activator.java:111)
> at
> org.apache.karaf.util.tracker.BaseActivator.run(BaseActivator.java:233)
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at java.lang.Thread.run(Thread.java:745)
> {code}
> The problems seems to be that the ProtectionDomain of the classes loaded from
> bundles do use the URL handler as their code source. This means that any
> access to those URL will throw IllegalStateException after the framework has
> been shutdown.
> The protection domain should use the url the jar from the filesystem for the
> code source url instead.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)