Object construction is supposed to cause a "happens before" so that every single constructor doesn't have to have "synchronized" on it, to work in a concurrent environment. Creating a thread, or otherwise leaking a "this" reference, calling a non-final method and other such "errors" in constructors are ways that you can end up without visibility of the completely constructed object.
Gregg Wonderly On Feb 25, 2013, at 2:32 PM, Peter <[email protected]> wrote: > Did you mean Sun bug number? 7123126 > > I'm wondering, the init method sets fields during construction of > SocketPermission, are these fields guaranteed to be visible to all threads > after construction? > > Peter. > > ----- Original message ----- >> What is the issue number for you issue Peter? >> >> Gregg >> >> On Feb 25, 2013, at 7:33 AM, Dan Creswell <[email protected]> wrote: >> >>> On 25 February 2013 12:40, Peter Firmstone <[email protected]> wrote: >>>> Bryan, >>>> >>>> I'm interrogating the usual suspects first. >>>> >>>> I've checked com.sun.jini.start.AggregatePolicyProvider and >>>> MergedPolicyProvider but they look clean, java.security.Permissions is >>>> known >>>> to have UnresolvablePermissions and not resolve them, however that >>>> visibility issue is limited to UnresolvePermission's (I had to write an >>>> entire replacement in org.apache.river.api.security.ConcurrentPermissions >>>> to >>>> get around that issue, that's another story, I haven't raised a bug with >>>> Oracle, I'll do that after they sort out the SocketPermission concurrency >>>> bug I've raised, don't want to give them too much work all at once :). >>>> >>>> From java.security.Permission javadoc: >>>> >>>>> Permission objects are similar to String objects in that they are >>>>> immutable once they have been created. Subclasses should not provide >>>>> methods that can change the state of a permission once it has been >>>>> created. >>>> >>>> >>>> SocketPermission, breaks this contract, it mutates internally after >>>> construction, this might be affecting thread visibility. >>>> >>> >>> Mmmm, I've just given that a light review and whilst it mutates it >>> looks like it's all simple assignments with no inter-dependencies and >>> the assignments are arguably deterministic (e.g. it's getting hold of >>> machine names or IP addresses which don't change much except via DHCP >>> games etc. So they *could* change but if they did it'd screw up many >>> things other than permissions). >>> >>> Each of the fields is a primitive or a reference which are atomic >>> assignments (there are no longs for example). >>> >>> Each thread will go through the same sequence of assignments and >>> initialisations so whilst there may be overlap, all threads will see >>> either an uninitialised or initialised value. In cases where the value >>> is uninitialised each thread will compute that itself and assign it >>> itself. There would be potential for duplicate work to be done in >>> initialisation but it's probably better than having locking and thread >>> contention in this case. >>> >>> As I say, light review, so it could be the culprit but it doesn't feel >>> like a great candidate to me. >>> >>>> I noticed test failures aren't definite, the number of failed tests has >>>> been >>>> reduced significantly by enabling security debugging, luckily we're still >>>> seeing failures however. >>> >>> Suggests a race condition for sure... >>> >>>> >>>> We're going to need to step through one of these tests and cofirm the >>>> policy >>>> provider and check SocketPermission.implies(). >>>> >>>> I suspect we're having issues with SocketPermission's thread visibility. >>>> >>>> If that's the case, there are three options for a fix: >>>> >>>> 1. Wait for Oracle to fix it (don't get your hopes up). >>>> 2. Construct SocketPermission on demand and thread confine it. >>>> 3. Create a replacement for SocketPermission and >>>> SocketPermissionCollection and substitute. >>>> >>>> If the issue is SocketPermission, I'll probably go for option 2. >>>> >>>> If it's something else, or the problem goes away during debugging, it could >>>> require much head scratching to fix (brute force patch attempts). >>>> >>>> The major problem is SocketPermission isn't being implied, the >>>> ProtectionDomain clearly has the required Permission, see appended. >>>> >>>> I'll get back to you with a patch to enable debugging and some >>>> instructions. >>>> >>>> Thanks again for helping, >>>> >>>> Peter. >>>> >>>>> ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err:access: access denied >>>>> (java.net.SocketPermission bryan-thompson-macbook-Air.local >>>>> connect,accept,resolve) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 >>>>> AM:Group-0:err:java.lang.Exception: Stack trace >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Thread.dumpStack(Thread.java:1273) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessControlContext.checkPermission(AccessControlContext.java:364) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessController.checkPermission(AccessController.java:549) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.SecurityManager.checkPermission(SecurityManager.java:532) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader$4.run(URLClassLoader.java:515) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessController.doPrivileged(Native Method) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader.getPermissions(URLClassLoader.java:513) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.loader.pref.PreferredClassLoader.getPermissions(PreferredClassLoader.java:1137) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:235) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader.defineClass(URLClassLoader.java:283) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader.access$000(URLClassLoader.java:58) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader$1.run(URLClassLoader.java:197) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessController.doPrivileged(Native Method) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.net.URLClassLoader.findClass(URLClassLoader.java:190) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.ClassLoader.loadClass(ClassLoader.java:306) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.loader.pref.PreferredClassLoader.loadClass(PreferredClassLoader.java:965) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.ClassLoader.loadClass(ClassLoader.java:247) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Class.getDeclaredMethods0(Native Method) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Class.privateGetDeclaredMethods(Class.java:2436) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Class.privateGetPublicMethods(Class.java:2556) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Class.getMethods(Class.java:1412) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> sun.misc.ProxyGenerator.generateClassFile(ProxyGenerator.java:409) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> sun.misc.ProxyGenerator.generateProxyClass(ProxyGenerator.java:306) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.reflect.Proxy.getProxyClass0(Proxy.java:610) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.reflect.Proxy.getProxyClass(Proxy.java:394) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.loader.pref.PreferredClassProvider.loadProxyClass(PreferredClassProvider.java:1308) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.loader.pref.PreferredClassProvider.loadProxyClass(PreferredClassProvider.java:1186) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.loader.ClassLoading.loadProxyClass(ClassLoading.java:240) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.io.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:373) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1528) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1490) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1729) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:348) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Util.unmarshalValue(Util.java:221) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.jeri.BasicInvocationDispatcher.unmarshalArguments(BasicInvocationDispatcher.java:1057) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.jeri.BasicInvocationDispatcher.dispatch(BasicInvocationDispatcher.java:601) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target$2.run(Target.java:491) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.export.ServerContext.doWithServerContext(ServerContext.java:108) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target.dispatch(Target.java:488) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target.access$000(Target.java:57) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target$1.run(Target.java:464) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessController.doPrivileged(Native Method) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target.dispatch(Target.java:461) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.Target.dispatch(Target.java:426) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.runtime.DgcRequestDispatcher.dispatch(DgcRequestDispatcher.java:210) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> net.jini.jeri.connection.ServerConnectionManager$Dispatcher.dispatch(ServerConnectionManager.java:147) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.mux.MuxServer$1$1.run(MuxServer.java:244) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.security.AccessController.doPrivileged(Native Method) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.jeri.internal.mux.MuxServer$1.run(MuxServer.java:241) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.thread.ThreadPool$Task.run(ThreadPool.java:143) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> com.sun.jini.thread.ThreadPool$Worker.run(ThreadPool.java:177) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: at >>>>> java.lang.Thread.run(Thread.java:680) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err:access: >>>>> access allowed (java.security.SecurityPermission getPolicy) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err:access: >>>>> domain that failed ProtectionDomain >>>>> (http://bryan-thompson-macbook-Air.local:9080/phoenix-dl.jar<no signer >>>>> certificates>) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: null >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err:<no >>>>> principals> >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> java.security.Permissions@ec0a9f9 ( >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.io.FilePermission >>>>> /Users/bryan/Documents/workspace/river/trunk/qa/lib/- read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission apple.laf.* read,write) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vendor.url read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.name read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission com.apple.macos.useScreenMenuBar read,write) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission file.separator read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.specification.vendor read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission line.separator read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.specification.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission FILEPOLICY02 read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.specification.vendor read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.* read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission os.name read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.system.class.loader read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.vendor read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission path.separator read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.specification.name read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission os.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission >>>>> com.sun.jini.reggie.enableImplToStubReplacement read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission com.apple.hwaccel read,write) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission mrj.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission os.arch read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission apple.awt.* read,write) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.class.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vendor read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.vm.specification.name read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.util.PropertyPermission java.specification.version read) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (unresolved >>>>> com.sun.jini.phoenix.ExecPermission /bin/javax ) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (unresolved >>>>> com.sun.jini.phoenix.ExecPermission /bin/javax ) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (unresolved >>>>> com.sun.jini.phoenix.ExecOptionPermission * ) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (unresolved >>>>> com.sun.jini.phoenix.ExecOptionPermission * ) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.security.SecurityPermission getPolicy) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.lang.RuntimePermission createClassLoader) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.lang.RuntimePermission stopThread) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.net.SocketPermission bryan-thompson-macbook-Air.local >>>>> connect,accept,resolve) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.net.SocketPermission bryan-thompson-macbook-Air.local:9080 >>>>> connect,resolve) >>>>> [java] ActSys-err: Feb 24, 2013 8:24:07 AM:Group-0:err: >>>>> (java.net.SocketPermission localhost:1024- listen,resolve) >>>> >>>> >>>> >> >
