[OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen when fontconfig.properties was used
Langer, Christoph
christoph.langer at sap.com
Thu Dec 19 12:25:07 UTC 2019
Hi Ichiroh,
thanks for looking at this and testing it.
Both points are good catches, here's an updated webrev: http://cr.openjdk.java.net/~clanger/webrevs/8221741.1/
Please test this and let me know if it solves your issues.
Best regards
Christoph
> -----Original Message-----
> From: Ichiroh Takiguchi <takiguc at linux.vnet.ibm.com>
> Sent: Donnerstag, 19. Dezember 2019 12:58
> To: Langer, Christoph <christoph.langer at sap.com>
> Cc: Phil Race <philip.race at oracle.com>; 2d-dev at openjdk.java.net
> Subject: RE: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen
> when fontconfig.properties was used
>
> 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(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