Uploaded image for project: 'Confluence Data Center'
  1. Confluence Data Center
  2. CONFSERVER-4940

Page can be set as its own parent page, resulting in data corruption

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • High
    • 2.0
    • 1.3.5
    • None
    • Standalone version.
      JDK 1.4.2
      Windows 2003 Server.

    Description

      I have had a user report a problem with a page he updated. After investigation, I suspect he fell victim to the following bug, which I was able to reproduce in a test space.

      Here is the scenario and the expected behavior:
      1. start with an existing page
      2. bring up the page update screen
      3. enter the name of the page in the page's parent page field
      4. save ('update')
      5. EXPECT: validation error indicating that a page cannot be its own parent
      6. reenter the name of the page in the parent page field, but this time with a different case
      7. EXPECT: validation error indicating that a page cannot be its own parent

      In reality however, while expectation 5 is met (" The page itself can not be set as its own parent page."), expectation 7 fails and the page is saved.
      Because page name uniqueness in Confluence is on a case-insensitive basis (even though the case is preserved), the resulting page is in effect pointing to itself as its own parent. Unsurprisingly trying to access the page causes the system error below (stack overflow due to infinite recursion in the Page.getAncestry() method).

      Beside needing the defect to be fixed (to avoid future page corruption), I also need help restoring the affected user pages to a working order. Or will I have to ask them to recreate the pages by hand?

      Cause:
      org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getAncestry' in class com.atlassian.confluence.pages.Page threw exception class java.lang.StackOverflowError : null

      Stack Trace: [hide]

      org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getAncestry' in class com.atlassian.confluence.pages.Page threw exception class java.lang.StackOverflowError : null
      at org.apache.velocity.runtime.parser.node.PropertyExecutor.execute(PropertyExecutor.java:188)
      at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:226)
      at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:207)
      at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:357)
      at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:135)
      at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
      at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
      at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
      at org.apache.velocity.runtime.directive.Parse.render(Parse.java:232)
      at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:153)
      at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
      at org.apache.velocity.Template.merge(Template.java:296)
      at com.opensymphony.webwork.dispatcher.VelocityResult.doExecute(VelocityResult.java:91)
      at bucket.util.profiling.ProfiledVelocityResult.doExecute(ProfiledVelocityResult.java:18)
      at com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:116)
      at com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:263)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:187)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:55)
      at com.atlassian.confluence.core.ConfluenceWorkflowInterceptor.intercept(ConfluenceWorkflowInterceptor.java:33)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.atlassian.confluence.core.ConfluenceValidationInterceptor.intercept(ConfluenceValidationInterceptor.java:16)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.atlassian.confluence.security.actions.PermissionCheckInterceptor.intercept(PermissionCheckInterceptor.java:40)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.atlassian.confluence.pages.actions.PageAwareInterceptor.intercept(PageAwareInterceptor.java:73)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.atlassian.confluence.core.ConfluenceAutowireInterceptor.intercept(ConfluenceAutowireInterceptor.java:25)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.atlassian.confluence.user.actions.AuthenticatedUserInterceptor.intercept(AuthenticatedUserInterceptor.java:51)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.atlassian.confluence.util.XWorkTransactionInterceptor.intercept(XWorkTransactionInterceptor.java:133)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
      at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
      at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115)
      at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:229)
      at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
      at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
      at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:432)
      at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:356)
      at com.atlassian.confluence.servlet.simpledisplay.SimpleDisplayServlet.doGet(SimpleDisplayServlet.java:44)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
      at com.atlassian.confluence.util.profiling.ProfilingPageFilter.parsePage(ProfilingPageFilter.java:159)
      at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:168)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.atlassian.seraph.filter.LoginFilter.doFilter(LoginFilter.java:181)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.atlassian.johnson.filters.JohnsonFilter.doFilter(JohnsonFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:170)
      at bucket.custom.FlushingSpringSessionInViewFilter.doFilterInternal(FlushingSpringSessionInViewFilter.java:30)
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:73)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:132)
      at com.atlassian.confluence.util.error.ProfilingAndErrorFilter.doFilter(ProfilingAndErrorFilter.java:27)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:36)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
      at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
      at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
      at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
      at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
      at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
      at java.lang.Thread.run(Thread.java:534)

      Referer URL: http://confluence/dashboard.action

      Build Information:
      Uptime: 7 minutes, 23 seconds
      Version: 1.3.5
      Build Number: 122

      Server Information:
      Application Server: Apache Tomcat/4.1.30
      Servlet Version: 2.3
      Database Dialect: net.sf.hibernate.dialect.HSQLDialect

      Memory Information:
      Total Memory: 587 MB
      Free Memory: 228 MB
      Used Memory: 359 MB

      System Information:
      System Date: Wednesday, 14 Dec 2005
      System Time: 12:18:29
      System Favourite Colour: Lime
      Java Version: 1.4.2_04
      Java Vendor: Sun Microsystems Inc.
      JVM Version: 1.0
      JVM Vendor: Sun Microsystems Inc.
      JVM Implementation Version: 1.4.2_04-b05
      Java Runtime: Java(TM) 2 Runtime Environment, Standard Edition
      Java VM: Java HotSpot(TM) Client VM
      User Name: dev_build
      User Timezone: America/New_York
      Operating System: Windows 2003 5.2
      OS Architecture: x86
      Request

      Information:
      URL: http://confluence/display/sandbox/Test+Child+Page+1.2

      • Scheme: http
      • Server: confluence
      • Port: 80
      • URI: /500page.jsp
      • - Context Path:
      • - Servlet Path: /500page.jsp
      • - Path Info: null
      • - Query String: null

      Attributes:

      • javax.servlet.error.exception : org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getAncestry' in class com.atlassian.confluence.pages.Page threw exception class java.lang.StackOverflowError : null
      • javax.servlet.error.message :
      • os_securityfilter_already_filtered : true
      • com.atlassian.johnson.filters.JohnsonFilter_already_filtered : true
      • _sitemesh_using_stream : false
      • javax.servlet.error.request_uri : /display/sandbox/Test+Child+Page+1.2
      • javax.servlet.error.status_code : 500
      • _sitemesh_filterapplied : true
      • javax.servlet.error.servlet_name : simple-display
      • webwork.valueStack : com.opensymphony.xwork.util.OgnlValueStack@c81bd9
      • loginfilter.already.filtered : true
      • atlassian.core.seraph.original.url : /display/sandbox/Test+Child+Page+1.2
      • javax.servlet.jsp.jspException : org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getAncestry' in class com.atlassian.confluence.pages.Page threw exception class java.lang.StackOverflowError : null
      • sessioninview.FILTERED : true

      Parameters:

      Logging:
      0 log statements generated by this request.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              f3ee14bbfaaf Othman Alaoui
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: