[OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen when fontconfig.properties was used
Ichiroh Takiguchi
takiguc at linux.vnet.ibm.com
Thu Dec 19 18:33:08 UTC 2019
Hello Christoph.
I tested the patch which was in 8221741.1.
I worked fine including testcase.
Please let me know if you need additional testing.
Thanks,
Ichiroh Takiguchi
On 2019-12-19 21:25, Langer, Christoph wrote:
> 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