Martin Leitner created FOP-3323:
-----------------------------------

             Summary: NPE in layout manager when `fo:title` carries an `id` 
attribute — `Page.getPageViewport()` on null `this.curPage`
                 Key: FOP-3323
                 URL: https://issues.apache.org/jira/browse/FOP-3323
             Project: FOP
          Issue Type: Bug
          Components: layout/unqualified, renderer/pdf
    Affects Versions: 2.11
            Reporter: Martin Leitner
         Attachments: no-title.fo, title-no-id.fo, title-with-id.fo

*Description*

FOP throws a {{NullPointerException}} in the layout manager when a {{fo:title}} 
element carries an {{id}} attribute. The failure happens while wiring the 
per-page ID->element map: {{Page.getPageViewport()}} is invoked on 
{{{}this.curPage{}}}, which is still {{null}} because {{fo:title}} is processed 
at {{fo:page-sequence}} scope, before any page has been constructed.

 
{code:java}
java.lang.NullPointerException: Cannot invoke
"org.apache.fop.layoutmgr.Page.getPageViewport()" because "this.curPage" is 
null{code}
Note: {{fo:title}} is _not permitted_ to carry {{id}} per XSL-FO 1.1 §6.4.20 
(its allowed properties do not include the {{id}} property). So this is invalid 
FO input. The request here is not to _accept_ the {{{}id{}}}, but for FOP to 
fail gracefully (validation error / skipped registration) instead of NPE-ing. 
This is consistent with the existing documented limitation on the Known Issues 
page ("the 'id' attributes are not properly handled for all block-level / 
inline-level FO elements").

*Steps to reproduce*

Three sibling FO files isolate the trigger. They are identical except for the 
presence of {{fo:title}} and its {{{}id{}}}.
 # title-with-id.fo: triggers the NPE
 # title-no-id.fo: renders OK (same file, {{id}} removed from {{{}fo:title{}}})
 # no-title.fo: renders OK (same file, {{fo:title}} removed entirely)

Run each:

 
{code:java}
fop -fo title-with-id.fo -pdf out.pdf
{code}
 
||Input ||Result ||
|no-title.fo|OK - renders to PDF |
|title-no-id.fo|OK - renders to PDF |
|title-with-id.fo|NPE - {{Page.getPageViewport()}} on null {{this.curPage}}|

File 1 differs from file 2 only by {{id="t1"}} on {{{}fo:title{}}}.

 

*Expected*

Either a clean validation error ("property 'id' is not applicable to fo:title") 
or silently skip ID registration for {{{}fo:title{}}}. No 
{{{}NullPointerException{}}}.

*Actual*

Uncaught {{NullPointerException}} from the layout manager; processing aborts.

*Suggested fix*
 * AreaTreeHandler / PageSequenceLayoutManager - defer wiring fo:title/@id into 
the ID->element map until the first page is constructed, _or_ skip ID 
registration for fo:title (it lives outside any page viewport).
 * Defensive guard on {{this.curPage == null}} before the 
Page.getPageViewport() call.

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to