DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUGĀ·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=37882>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED ANDĀ·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=37882

           Summary: ClassCircularityError when principal included in
                    security policy
           Product: Tomcat 5
           Version: 5.5.14
          Platform: Sun
        OS/Version: Solaris
            Status: NEW
          Keywords: ErrorMessage
          Severity: blocker
          Priority: P2
         Component: Catalina
        AssignedTo: tomcat-dev@jakarta.apache.org
        ReportedBy: [EMAIL PROTECTED]


Symptoms:

If catalina.policy is changed to include grants that have any principals
specified (including wildcard principals "* *") then any web application that is
protected with a security constraint will cause a
java.lang.ClassCircularityError to be thrown when an attempt is made to log 
into it.

How to reproduce:

1. In the jsp-examples web application edit web.xml and comment out or delete
the following lines:

<servlet>
  <servlet-name>org.apache.jsp.security.protected_.index_jsp</servlet-name>
  <servlet-class>org.apache.jsp.security.protected_.index_jsp</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>org.apache.jsp.security.protected_.index_jsp</servlet-name>
  <url-pattern>/security/protected/index.jsp</url-pattern>
</servlet-mapping>

2. Add the following grant to catalina.policy:
  grant principal * * {
      permission java.util.PropertyPermission "*", "read";
  };

3. Start tomcat with the security manager enabled (-security).

4. Attempt to log into the jsp-examples protected application with the following
URL (modified to suit of course)
  http://<ip address>:<port>/jsp-examples/security/protected/index.jsp

You should then see the following exception:

java.lang.ClassCircularityError: WILDCARD_PRINCIPAL_CLASS
        java.lang.Class.forName0(Native Method)
        java.lang.Class.forName(Class.java:242)
        sun.security.provider.PolicyFile.addPermissions(PolicyFile.java:1403)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1307)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1270)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1211)
        sun.security.provider.PolicyFile.implies(PolicyFile.java:1166)
        java.security.ProtectionDomain.implies(ProtectionDomain.java:195)
        
java.security.AccessControlContext.checkPermission(AccessControlContext.java:249)
        
java.security.AccessController.checkPermission(AccessController.java:427)
        java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        java.lang.SecurityManager.checkRead(SecurityManager.java:871)
        java.io.File.exists(File.java:700)
        org.apache.naming.resources.FileDirContext.file(FileDirContext.java:826)
        
org.apache.naming.resources.FileDirContext.lookup(FileDirContext.java:210)
        
org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:293)
        
org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:1851)
        
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1716)
        
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:866)
        
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1319)
        
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
        java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        java.lang.Class.forName0(Native Method)
        java.lang.Class.forName(Class.java:242)
        sun.security.provider.PolicyFile.addPermissions(PolicyFile.java:1403)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1307)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1270)
        sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1211)
        sun.security.provider.PolicyFile.implies(PolicyFile.java:1166)
        java.security.ProtectionDomain.implies(ProtectionDomain.java:195)
        
java.security.AccessControlContext.checkPermission(AccessControlContext.java:249)
        
java.security.AccessController.checkPermission(AccessController.java:427)
        java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1512)
        sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
        java.lang.ClassLoader.loadClass(ClassLoader.java:299)
        java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        
org.apache.jasper.servlet.JspServletWrapper.<init>(JspServletWrapper.java:101)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:307)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        java.lang.reflect.Method.invoke(Method.java:585)
        org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
        java.security.AccessController.doPrivileged(Native Method)
        javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
        org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
        
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)

Notes:

The same error will occur no matter what principal class you try. It looks like
the code is trying to load the principal class when refreshing the policy but
then checks its permission to load the class and trys to refresh the policy to
do that and then gets the ClassCircularityError.

Note that the error will not occur if you leave web.xml as it is. This is
obviously a point of some importance but the error was originally seen with our
web application that has all of its JSP's mapped to servlets in web.xml using
similar declarations created by JSPC so it doesn't appear that modifying web.xml
is going to help us in this regard.

This problem has been seen by other people. One of them proposed moving all
classes to the shared directory but this had no effect in our case. Here are
some references:

http://marc.theaimsgroup.com/?l=tomcat-user&m=108497966630946&w=2
http://mail-archives.apache.org/mod_mbox/jakarta-tomcat-user/200408.mbox/[EMAIL 
PROTECTED]

Finally, as noted in the second reference, the problem doesn't seem to happen in
tomcat 5.0.19 (but then we have other problems, as well as having to go
backwards in tomcat revisions)

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to