StackOverFlowError with arabic characters - FOP issue or font issue?

<[email protected]> Thu, 21 Aug 2025 08:17:02 +0000
Newsgroups gmane.text.xml.fop.user
Message-ID <BEVP281MB37423D8486389CA8F78F6AA0C132A@BEVP281MB3742.DEUP281.PROD.OUTLOOK.COM>
--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_
Content-Type: text/plain; charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

Hi,

I am having a problem when using FOP with an Arabic font (Hasubi, https://g=
ithub.com/eliheuer/hasubi-mono) and the following string: =E1=C3

Input XML:
<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<string>=E1=C3</string>

Stylesheet:
<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<xsl:stylesheet xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"
  xmlns:fo=3D"http://www.w3.org/1999/XSL/Format" version=3D"1.0">
  <xsl:output method=3D"xml" indent=3D"yes" encoding=3D"UTF-8"/>
  <xsl:template match=3D"/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name=3D"A4" page-height=3D"29.7cm" pa=
ge-width=3D"21cm" margin=3D"1cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference=3D"A4">
        <fo:flow flow-name=3D"xsl-region-body">
          <xsl:apply-templates select=3D"string"/>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
  <xsl:template match=3D"string">
    <fo:block font-family=3D"CustomFont" font-size=3D"10pt">
      <xsl:value-of select=3D"."/>
    </fo:block>
  </xsl:template>
</xsl:stylesheet>

Custom font Hasubi is defined in my fop.xconf:
<?xml version=3D"1.0"?>
<fop version=3D"1.0">
    <strict-configuration>true</strict-configuration>
    <strict-validation>false</strict-validation>
    <base>.</base>
    <renderers>
        <renderer mime=3D"application/pdf">
            <fonts>
                <font kerning=3D"yes" embed-url=3D"file:///C:/Temp/Hasubi-M=
ono.ttf">
                  <font-triplet name=3D"CustomFont" style=3D"normal" weight=
=3D"normal"/>
                </font>
            </fonts>
        </renderer>
    </renderers>
</fop>

I have tested with OpenJDK 17 and FOP 2.11 on windows starting via commandl=
ine:
fop-2.11\fop\fop.bat -c fop.xconf -xml input.xml -xsl stylesheet.xsl -pdf o=
ut.pdf

Resulting in the following stacktrace:
Aug. 21, 2025 10:11:31 AM org.apache.fop.apps.FOUserAgent processEvent
INFORMATION: Rendered page #1.
Exception in thread "main" java.lang.StackOverflowError
        at java.base/java.util.HashMap.putVal(HashMap.java:627)
        at java.base/java.util.HashMap.put(HashMap.java:610)
        at java.base/java.util.HashSet.add(HashSet.java:221)
        at org.apache.fop.fonts.truetype.GlyfTable.retrieveComposedGlyphs(G=
lyfTable.java:225)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:158)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
        at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursively(Gl=
yfTable.java:160)
(and so on)

So, the question: Is this a FOP issue (stack overflow should be detected/av=
oided) or is the font simply broken in some way? =96 Testing with other fon=
ts (e.g. Cascadia Mono or Noto Sans Arabic) works without issues.


Thanks,
Tim Weller

--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_
Content-Type: text/html; charset="windows-1256"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dwindows-1=
256">
<meta name=3D"Generator" content=3D"Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Aptos;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	font-size:11.0pt;
	font-family:"Aptos",sans-serif;
	mso-ligatures:standardcontextual;
	mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:#467886;
	text-decoration:underline;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:11.0pt;
	mso-fareast-language:EN-US;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=3D"DE" link=3D"#467886" vlink=3D"#96607D" style=3D"word-wrap:bre=
ak-word">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">Hi,<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I am having a problem when usin=
g FOP with an Arabic font (Hasubi,
<a href=3D"https://github.com/eliheuer/hasubi-mono">https://github.com/elih=
euer/hasubi-mono</a>) and the following string:
</span><span style=3D"font-family:&quot;Arial&quot;,sans-serif">=E1=C3</spa=
n><span lang=3D"EN-US"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Input XML:<o:p></o:p></span></p=
>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;?xml version=3D&quot;1.0&qu=
ot; encoding=3D&quot;UTF-8&quot;?&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;string&gt;</span><span styl=
e=3D"font-family:&quot;Arial&quot;,sans-serif">=E1=C3</span><span lang=3D"E=
N-US">&lt;/string&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Stylesheet:<o:p></o:p></span></=
p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;?xml version=3D&quot;1.0&qu=
ot; encoding=3D&quot;UTF-8&quot;?&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;xsl:stylesheet xmlns:xsl=3D=
&quot;http://www.w3.org/1999/XSL/Transform&quot;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; </span>xmlns:fo=3D&quot;=
http://www.w3.org/1999/XSL/Format&quot; version=3D&quot;1.0&quot;&gt;<o:p><=
/o:p></p>
<p class=3D"MsoNormal">&nbsp; <span lang=3D"EN-US">&lt;xsl:output method=3D=
&quot;xml&quot; indent=3D&quot;yes&quot; encoding=3D&quot;UTF-8&quot;/&gt;<=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &lt;xsl:template match=
=3D&quot;/&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;fo:root&gt;<o=
:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &lt;fo:lay=
out-master-set&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &lt=
;fo:simple-page-master master-name=3D&quot;A4&quot; page-height=3D&quot;29.=
7cm&quot; page-width=3D&quot;21cm&quot; margin=3D&quot;1cm&quot;&gt;<o:p></=
o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &lt;fo:region-body/&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &lt=
;/fo:simple-page-master&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &lt;/fo:la=
yout-master-set&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &lt;fo:pag=
e-sequence master-reference=3D&quot;A4&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &lt=
;fo:flow flow-name=3D&quot;xsl-region-body&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &lt;xsl:apply-templates select=3D&quot;string&quot;/&gt;<o:p></o:p></sp=
an></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &lt=
;/fo:flow&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &lt;/fo:pa=
ge-sequence&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;/fo:root&gt;<=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &lt;/xsl:template&gt;<o:=
p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &lt;xsl:template match=
=3D&quot;string&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;fo:block font=
-family=3D&quot;CustomFont&quot; font-size=3D&quot;10pt&quot;&gt;<o:p></o:p=
></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &lt;xsl:va=
lue-of select=3D&quot;.&quot;/&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;/fo:block&gt;=
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; </span>&lt;/xsl:template=
&gt;<o:p></o:p></p>
<p class=3D"MsoNormal">&lt;/xsl:stylesheet&gt;<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Custom font Hasubi is defined i=
n my fop.xconf:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;?xml version=3D&quot;1.0&qu=
ot;?&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&lt;fop version=3D&quot;1.0&quo=
t;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;strict-config=
uration&gt;true&lt;/strict-configuration&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;strict-valida=
tion&gt;false&lt;/strict-validation&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;base&gt;.&lt;=
/base&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &lt;renderers&gt;=
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &lt=
;renderer mime=3D&quot;application/pdf&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &lt;fonts&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &lt;font kerning=3D&quot;yes&quot; embed-url=3D&qu=
ot;file:///C:/Temp/Hasubi-Mono.ttf&quot;&gt;<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;font-triplet name=3D&quot;CustomFont&qu=
ot; style=3D&quot;normal&quot; weight=3D&quot;normal&quot;/&gt;<o:p></o:p><=
/span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; </span>&lt;/font&gt;<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/fonts=
&gt;<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/renderer&gt;<o:p></=
o:p></p>
<p class=3D"MsoNormal">&nbsp; &nbsp; &lt;/renderers&gt;<o:p></o:p></p>
<p class=3D"MsoNormal">&lt;/fop&gt;<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I have tested with OpenJDK 17 a=
nd FOP 2.11 on windows starting via commandline:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">fop-2.11\fop\fop.bat -c fop.xco=
nf -xml input.xml -xsl stylesheet.xsl -pdf out.pdf<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Resulting in the following stac=
ktrace:<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Aug. 21, 2025 10:11:31 AM org.a=
pache.fop.apps.FOUserAgent processEvent<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">INFORMATION: Rendered page #1.<=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Exception in thread &quot;main&=
quot; java.lang.StackOverflowError<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at java.base/java.util.HashMap.putVal(HashMap.java:627)<o:p></o=
:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at java.base/java.util.HashMap.put(HashMap.java:610)<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at java.base/java.util.HashSet.add(HashSet.java:221)<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.retrieveComposedGlyp=
hs(GlyfTable.java:225)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:158)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp; at org.apache.fop.fonts.truetype.GlyfTable.scanGlyphsRecursivel=
y(GlyfTable.java:160)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">(and so on)<o:p></o:p></span></=
p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">So, the question: Is this a FOP=
 issue (stack overflow should be detected/avoided) or is the font simply br=
oken in some way? =96 Testing with other fonts (e.g. Cascadia Mono or Noto =
Sans Arabic) works without issues.<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Thanks,<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Tim Weller<o:p></o:p></span></p=
>
</div>
</body>
</html>

--_000_BEVP281MB37423D8486389CA8F78F6AA0C132ABEVP281MB3742DEUP_--