[OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen when fontconfig.properties was used
Langer, Christoph
christoph.langer at sap.com
Thu Dec 19 20:01:40 UTC 2019
Hi Phil,
Type 1 fonts were available but got skipped.
/Christoph
> -----Original Message-----
> From: Phil Race <philip.race at oracle.com>
> Sent: Donnerstag, 19. Dezember 2019 20:58
> To: Langer, Christoph <christoph.langer at sap.com>; Ichiroh Takiguchi
> <takiguc at linux.vnet.ibm.com>
> Cc: 2d-dev at openjdk.java.net
> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen
> when fontconfig.properties was used
>
> Hi,
>
> > If this can get reviewed, I intend to push this fix to JDK14.
>
> Not for 14. This will take some time to review and test and is too risky at this
> stage.
>
> You say no TrueType fonts are installed, does that mean there are no
> scaleable fonts at all,
> or are there Type 1 fonts we are skipping over ?
>
> -phil.
>
>
>
> On 12/18/19 6:31 AM, 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(SunFontMa
> nager.java:1081)
> > at
> java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontMan
> ager.java:960)
> > at
> java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontM
> anager.java:898)
> > at
> java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager
> .java:914)
> > at
> java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2
> 105)
> > ...
> >
> > 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