[OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen when fontconfig.properties was used

Ichiroh Takiguchi takiguc at linux.vnet.ibm.com
Thu Dec 19 11:58:12 UTC 2019


Hello Langer.

I tested our HeadLess testcase.
(I used jdk11u based code.)

I tried to install/uninstall X11.fnt.iso_T1 fileset.

I found 2 issues:
1. FontUtilities.getLogger() returns null unless sun.java2d.debugfonts 
system property is specified properly.
    So FontUtilities.isLogging() should be called to check logger can 
use.
2. "font2d" is not good for following code
+                        .warning("Font returned by findFont2D for 
default font name " +
+                                 defaultFontName + " is not a physical 
font: " + font2d);
    font2d.toString() calls getDefaultPhysialFont() again then 
stackoverflow was happened

Please let me know if you need additional testing.

Thanks,
Ichiroh Takiguchi

On 2019-12-18 23:31, Langer, Christoph wrote:
> Hi,
> 
> sorry for the long time that it took me to come back to this item.
> 
> I eventually spent quite a significant amount of time analyzing what's
> going wrong here. At least, I have a few AIX LPARs, where we would
> always encounter this type of Exception:
> 
> Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
> class sun.font.CompositeFont cannot be cast to class
> sun.font.PhysicalFont (sun.font.CompositeFont and
> sun.font.PhysicalFont are in module java.desktop of loader
> 'bootstrap')
>         at
> java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1081)
>         at
> java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:960)
>         at
> java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:898)
>         at
> java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager.java:914)
>         at
> java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2105)
>         ...
> 
> The problem on our systems is triggered by two factors. First is that
> the font configuration file contains paths to font files that don't
> exist. Secondly, the system's fontconfig has no TrueType Fonts
> installed. Now, during loading of fonts, it goes over these
> non-existing font files and tries to mark their initialization in
> sun.font.SunFontManager::initialiseDeferredFont(String fileNameKey) by
> adding the key into the initialisedFonts map. Since there is no font
> handle available because the font couldn't be loaded but the map's
> value must not be null, it wants to use the handle of the default
> physical font. So, calling getDefaultPhysicalFont at this place
> triggers findFont2D and then recursive calls into
> initialiseDeferredFont/getDefaultPhysicalFont/findFont2D until a
> matching default physical font was loaded. But it's quite
> indeterministic which font is returned at what place in findFont2D
> when the recursion is unwinded, so this ClassCastException occurs.
> 
> I propose to fix this by adding a "NULL FONT HANDLE" to use in
> initialisedFonts for fonts that can’t be loaded. This will remove
> the recursion during loading of fonts. And afterwards a default
> physical font can then still be resolved, even if our font
> configuration contains less fonts (no true type fonts).
> 
> In my change I also add small improvements to the exception cases when
> trying to load non-existent true type fonts and to method
> getDefaultPhysicalFont.
> 
> The test exercises font loading and it would demonstrate the issue
> without the fix on several of our AIX systems.
> 
> Here is the webrev: 
> http://cr.openjdk.java.net/~clanger/webrevs/8221741.0/
> 
> @Ichiroh-san: Can you test this fix in your environment and let me
> know if it fixes your issue?
> 
> I'll run a full platform test here at SAP, including JDK11.
> 
> If this can get reviewed, I intend to push this fix to JDK14.
> 
> Thanks & Best regards
> Christoph
> 
>> -----Original Message-----
>> From: Phil Race <philip.race at oracle.com>
>> Sent: Mittwoch, 30. Oktober 2019 17:07
>> To: Langer, Christoph <christoph.langer at sap.com>; Ichiroh Takiguchi
>> <takiguc at linux.vnet.ibm.com>
>> Cc: 2d-dev at openjdk.java.net; Zeller, Arno <arno.zeller at sap.com>
>> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen
>> when fontconfig.properties was used
>> 
>> Yes probably best if this is reviewed and approved by someone who
>> has access to AIX. I have no idea if the XLFDs are even correct ...
>> 
>> -phil.
>> 
>> On 10/30/19 8:00 AM, Langer, Christoph wrote:
>> > Hi Ichiroh,
>> >
>> > I'm currently observing a test issue on one of our AIX boxes with that patch
>> in place. Please give me some time to have a closer look...
>> >
>> > Best regards
>> > Christoph
>> >
>> >> -----Original Message-----
>> >> From: 2d-dev <2d-dev-bounces at openjdk.java.net> On Behalf Of Ichiroh
>> >> Takiguchi
>> >> Sent: Montag, 28. Oktober 2019 17:59
>> >> To: Philip Race <philip.race at oracle.com>
>> >> Cc: 2d-dev at openjdk.java.net; Zeller, Arno <arno.zeller at sap.com>
>> >> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen
>> >> when fontconfig.properties was used
>> >>
>> >> Hello Phil and other reviewers.
>> >>
>> >> I appreciate if you give me your comment and suggestion.
>> >>
>> >> Thanks,
>> >> Ichiroh Takiguchi
>> >>
>> >> On 2019-10-15 20:33, Ichiroh Takiguchi wrote:
>> >>> Hello Phil.
>> >>>
>> >>> Sorry for bad response.
>> >>>
>> >>> AIX is following case, but physical font is not defined by default.
>> >>>> If you have fonts installed and have a custom fontconfig.properties
>> >>>> file for AIX
>> >>>> which references those, then you should be able to get a default font
>> >>>> from that
>> >>>> set of known existent physical fonts.
>> >>> Please try following steps to emulate same kind this on linux (RHEL7).
>> >>> 1. Download DefaultFontTestA.java and fontconfig.properties files
>> >>>     Please modify fontconfig.properties if c0419bt_.pfb is not in
>> >>> /usr/share/X11/fonts/Type1 directory.
>> >>>
>> >>> 2. Compile and run with following options and environment variable.
>> >>>      $ javac --add-exports java.desktop/sun.font=ALL-UNNAMED
>> >>> DefaultFontTestA.java
>> >>>      $ USE_J2D_FONTCONFIG=no java --add-opens
>> >>> java.desktop/sun.font=ALL-UNNAMED
>> >>> -Dsun.awt.fontconfigfontconfig.properties DefaultFontTestA
>> >>>      defaultFontName=Dialog
>> >>>      defaultFontFileName=/dialog.ttf
>> >>>      Exception in thread "main" java.lang.ClassCastException: class
>> >>> sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont
>> >>> (sun.font.CompositeFont and sun.font.PhysicalFont are in module
>> >>> java.desktop of loader 'bootstrap')
>> >>>              at
>> >>>
>> >>
>> java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontMa
>> >> nager.java:1081)
>> >>>              at DefaultFontTestA.main(DefaultFontTestA.java:48)
>> >>>
>> >>>         Font2D font2d =
>> >>>              findFont2D(getDefaultFontFaceName(), Font.PLAIN,
>> >>> NO_FALLBACK);
>> >>>    Note:
>> >>>      USE_J2D_FONTCONFIG is defined into
>> >>> src/java.desktop/unix/native/common/awt/fontpath.c
>> >>>      Dialog and /dialog.ttf are defined into
>> >>> src/java.desktop/unix/classes/sun/awt/FcFontManager.java
>> >>>
>> >>> getDefaultFontFaceName returns defaultFontName, it's "Dialog".
>> >>> findFont2D() returns Dialog CompositeFont instead of physical font.
>> >>> I think we cannot control return value for
>> >>> physicalFonts.values().iterator();
>> >>> "defaultPhysicalFont = ((CompositeFont) font2d).getSlotFont(0);" is
>> >>> useful.
>> >>>
>> >>> Please give me your comment.
>> >>>
>> >>> Thanks,
>> >>> Ichiroh Takiguchi
>> >>>
>> >>> On 2019-10-09 01:06, Philip Race wrote:
>> >>>> I think this needs a little bit more explanation first.
>> >>>> Systems without fontconfig ... meaning without libfontconfig.
>> >>>> So does that mean you just can't find fonts or have none installed ?
>> >>>> If you have fonts installed and have a custom fontconfig.properties
>> >>>> file for AIX
>> >>>> which references those, then you should be able to get a default font
>> >>>> from that
>> >>>> set of known existent physical fonts.
>> >>>>
>> >>>> If you have neither .. then you have a system configuration problem
>> >>>> and without
>> >>>> a physical font installed avoiding an exception here isn't really
>> >>>> going to help you
>> >>>> get much further. Perhaps we should throw InternalError a bit earlier.
>> >>>> I see no point in trying to survive ..
>> >>>>
>> >>>> -phil
>> >>>>
>> >>>>
>> >>>> On 10/8/19, 12:35 AM, Langer, Christoph wrote:
>> >>>>> Hi Ichiroh,
>> >>>>>
>> >>>>> thanks for the update. It looks good to me. I'll run it through test
>> >>>>> system tonight and let you know if we see issues by tomorrow.
>> Should
>> >>>>> you not hear back from me, consider it as reviewed and tested ��
>> >>>>>
>> >>>>> Thanks
>> >>>>> Christoph
>> >>>>>
>> >>>>>> -----Original Message-----
>> >>>>>> From: Ichiroh Takiguchi<takiguc at linux.vnet.ibm.com>
>> >>>>>> Sent: Montag, 7. Oktober 2019 19:16
>> >>>>>> To: Langer, Christoph<christoph.langer at sap.com>
>> >>>>>> Cc: 2d-dev at openjdk.java.net; Zeller, Arno<arno.zeller at sap.com>
>> >>>>>> Subject: RE: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException
>> >> happen
>> >>>>>> when fontconfig.properties was used
>> >>>>>>
>> >>>>>> Hello Christoph.
>> >>>>>>
>> >>>>>> I appreciate your suggestion.
>> >>>>>> JTreg testcase could throw ClassCastException instead of
>> >>>>>> InvocationTargetException.
>> >>>>>> JTreg results were in JDK-8221741
>> >>>>>>
>> >>>>>> Bug:    https://bugs.openjdk.java.net/browse/JDK-8221741
>> >>>>>> Change:
>> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.05/
>> >>>>>>
>> >>>>>> Could you review the fix ?
>> >>>>>>
>> >>>>>> Thanks,
>> >>>>>> Ichiroh Takiguchi
>> >>>>>> IBM Japan, Ltd.
>> >>>>>>
>> >>>>>> On 2019-10-07 22:53, Langer, Christoph wrote:
>> >>>>>>> Hi Ichiroh,
>> >>>>>>>
>> >>>>>>> this is great, thanks for doing this. We regularly see this and
>> >>>>>>> just
>> >>>>>>> stumbled over it the other day where the fontconfig of our test
>> >>>>>>> user
>> >>>>>>> was corrupted somehow.
>> >>>>>>>
>> >>>>>>> As for the test, I would reduce the amount of reflection a little
>> >>>>>>> bit.
>> >>>>>>> It should not be necessary to access SunFontManager via
>> >>>>>>> Class.forName,
>> >>>>>>> you already exported it to the test via the @modules statement.
>> You
>> >>>>>>> can probably use this coding (please try as I didn't test it��):
>> >>>>>>>
>> >>>>>>>           SunFontManager sfm = SunFontManager.getInstance();
>> >>>>>>>           Field defaultFontName_fid =
>> >>>>>>> SunFontManager.class.getDeclaredField("defaultFontName");
>> >>>>>>>           defaultFontName_fid.setAccessible(true);
>> >>>>>>>           defaultFontName_fid.set(sfm, "Dialog");
>> >>>>>>>           Method loadFonts_mid =
>> >>>>>>> SunFontManager.class.getDeclaredMethod("loadFonts");
>> >>>>>>>           loadFonts_mid.setAccessible(true);
>> >>>>>>>           loadFonts_mid.invoke(sfm);
>> >>>>>>>           PhysicalFont physicalFont = sfm.getDefaultPhysicalFont();
>> >>>>>>>           System.out.println(physicalFont);
>> >>>>>>>
>> >>>>>>> If you want, I can run your (updated) patch through our test
>> >>>>>>> system.
>> >>>>>>>
>> >>>>>>> Thanks
>> >>>>>>> Christoph
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>> -----Original Message-----
>> >>>>>>>> From: 2d-dev<2d-dev-bounces at openjdk.java.net>  On Behalf Of
>> >>>>>>>> Ichiroh
>> >>>>>>>> Takiguchi
>> >>>>>>>> Sent: Montag, 7. Oktober 2019 09:33
>> >>>>>>>> To: 2d-dev at openjdk.java.net
>> >>>>>>>> Subject: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException
>> happen
>> >>>>>> when
>> >>>>>>>> fontconfig.properties was used
>> >>>>>>>>
>> >>>>>>>> Hello.
>> >>>>>>>>
>> >>>>>>>> Could you review the fix ?
>> >>>>>>>>
>> >>>>>>>> Bug:    https://bugs.openjdk.java.net/browse/JDK-8221741
>> >>>>>>>> Change:
>> >> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.04/
>> >>>>>>>> JTreg testcase and results are including JDK-8221741 [1].
>> >>>>>>>>
>> >>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8221741
>> >>>>>>>>
>> >>>>>>>> Thanks,
>> >>>>>>>> Ichiroh Takiguchi
>> >>>>>>>> IBM Japan, Ltd.


More information about the 2d-dev mailing list