JDK-4983039 : JDK 1.5 beta1: java.nio.channels.ClosedChannelException reading font file
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 5.0
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: windows_2000
  • CPU: x86
  • Submitted: 2004-01-23
  • Updated: 2004-02-09
  • Resolved: 2004-02-09
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
5.0 b38Fixed
Description
k.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:287)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getPrimitiveBounds(CompositeGraphicsNode.java:238)
        at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.getBounds2D(GraphicsNodeRable8Bit.java:144)
        at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.createRendering(GraphicsNodeRable8Bit.java:288)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.renderGNR(StaticRenderer.java:426)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(StaticRenderer.java:458)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(StaticRenderer.java:297)
        at 
org.apache.batik.swing.gvt.GVTTreeRenderer.run(GVTTreeRenderer.java:98)        

        ...
        (java.nio.channels.ClosedChannelException repeats ad infinitum)



Steps to Reproduce (be specific):


Option 1
   
    Turn on tracing in the Java Control panel
   
    Execute:
        javaws http://nagoya.apache.org/batik_1.1/batikNagoya.jnlp
       
    Shortly after the main window appears it will appear to hang (chewing CPU).
    Close the window and examine the Web Start .trace file

Option 2

    Download and extract 

      http://archive.apache.org/dist/xml/batik/batik-1.1.zip
   
    Execute:
        java -classpath 
batik-svgbrowser.jar;lib\batik-ext.jar;lib\batik-util.jar;lib\batik-awt-util.jar;lib\batik-gui-util.jar;lib\batik-dom.jar;lib\batik-css.jar;lib\batik-svg-dom.jar;lib\batik-gvt.jar;lib\batik-parser.jar;lib\batik-script.jar;lib\batik-transcoder.jar;lib\batik-bridge.jar;lib\batik-xml.jar;lib\crimson-parser.jar;js.jar
org.apache.batik.apps.svgbrowser.Main -font-size 10 
http://nagoya.apache.org/batik_1.1/start.svg

    Wait for the stack trace

Option 3

    Download and extract 

      http://archive.apache.org/dist/xml/batik/batik-src-1.1.zip
   
    Modify the build.xml so that the javac task specifies debug="on"
   
    Rebuild (I used Ant 1.5.3)
   
    Execute:
        java -classpath 
batik-svgbrowser.jar;lib\batik-ext.jar;lib\batik-util.jar;lib\batik-awt-util.jar;lib\batik-gui-util.jar;lib\batik-dom.jar;lib\batik-css.jar;lib\batik-svg-dom.jar;lib\batik-gvt.jar;lib\batik-parser.jar;lib\batik-script.jar;lib\batik-transcoder.jar;lib\batik-bridge.jar;lib\batik-xml.jar;lib\crimson-parser.jar;js.jar
org.apache.batik.apps.svgbrowser.Main -font-size 10 
http://nagoya.apache.org/batik_1.1/start.svg

    Wait for the stack trace


###@###.### 2004-01-23

2SE Version (please include all output from java -version flag):
  java version "1.5.0-beta"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32)
  Java HotSpot(TM) Client VM (build 1.5.0-beta-b32, mixed mode)

Does this problem occur on J2SE 1.4 or 1.4.1 or 1.4.2?  Yes / No (pick one)
  No, works fine with 1.4.2 and build32 for RedHat 9.0

Operating System Configuration Information (be specific):
  Windows 2000 Professional Service Pack 2

Hardware Configuration Information (be specific):
  Custom built Athlon 600MHz, TNT2 AGP, 384MB

Bug Description:
  The Batik 1.1 SVG Browser Demo (http://xml.apache.org/batik) fails to 
  start on Windows 2000 with Java 1.5.0-b32.  It should open a Swing UI 
  and render an SVG file (http://nagoya.apache.org/batik_1.1/start.svg).  
  Instead, a java.nio.channels.ClosedByInterruptException is thrown, 
  followed by a (seemingly never-ending) sequence of
  java.nio.channels.ClosedChannelExceptions.

  It appears to work fine using Java 1.4.2 on Windows and Red Hat
  Linux 9.0 (x86), and with Java 1.5.0-b32 under Red Hat 9.0.


  The SVG Browser is available as a Web Start application at
    http://nagoya.apache.org/batik_1.1/batikNagoya.jnlp

  It may also be run standalone, using the build available at
    http://archive.apache.org/dist/xml/batik/batik-1.1.zip
   
  The build helpfully omits debugging information, so to gain a more useful
  stack trace, the source is available at
    http://archive.apache.org/dist/xml/batik/batik-src-1.1.zip

  Any one of the above will adequately demonstrate the problem.

  The .trace file from running the Web Start version is...


Ignored exception: JNLPException[category: Download Error : Exception: 
java.io.IOException: HTTP response 404 : LaunchDesc: null ]
Ignored exception: JNLPException[category: Download Error : Exception: 
java.io.IOException: HTTP response 404 : LaunchDesc: null ]
java.nio.channels.ClosedByInterruptException
    at java.nio.channels.spi.AbstractInterruptibleChannel.end(Unknown 
Source)
    at sun.nio.ch.FileChannelImpl.position(Unknown Source)
    at sun.font.TrueTypeFont.readBlock(Unknown Source)
    at sun.font.FileFont.getGlyphImage(Native Method)
    at sun.font.FileFontStrike.getGlyphImagePtr(Unknown Source)
    at sun.font.FileFontStrike.getGlyphMetrics(Unknown Source)
    at sun.font.SunLayoutEngine.nativeLayout(Native Method)
    at sun.font.SunLayoutEngine.layout(Unknown Source)
    at sun.font.GlyphLayout$EngineRecord.layout(Unknown Source)
    at sun.font.GlyphLayout.layout(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.createGV(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.getGV(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.createLogicalBounds(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.getAdvance(Unknown Source)
    at java.awt.font.TextLine.init(Unknown Source)
    at java.awt.font.TextLine.<init>(Unknown Source)
    at java.awt.font.TextLine.createLineFromText(Unknown Source)
    at java.awt.font.TextLine.standardCreateTextLine(Unknown Source)
    at java.awt.font.TextLayout.standardInit(Unknown Source)
    at java.awt.font.TextLayout.<init>(Unknown Source)
    at 
org.apache.batik.gvt.text.BidiAttributedCharacterIterator.<init>(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getTextRuns(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getOutline(Unknown Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getBounds(Unknown Source)
    at 
org.apache.batik.gvt.renderer.BasicTextPainter.getPaintedBounds(Unknown 
Source)
    at org.apache.batik.gvt.TextNode.getPrimitiveBounds(Unknown Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.getBounds2D(Unknown 
Source)
    at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.createRendering(Unknown 
Source)
    at org.apache.batik.gvt.renderer.StaticRenderer.renderGNR(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(Unknown Source)
    at org.apache.batik.swing.gvt.GVTTreeRenderer.run(Unknown Source)
java.nio.channels.ClosedChannelException
    at sun.nio.ch.FileChannelImpl.ensureOpen(Unknown Source)
    at sun.nio.ch.FileChannelImpl.position(Unknown Source)
    at sun.font.TrueTypeFont.readBlock(Unknown Source)
    at sun.font.FileFont.getGlyphImage(Native Method)
    at sun.font.FileFontStrike.getGlyphImagePtr(Unknown Source)
    at sun.font.FileFontStrike.getGlyphMetrics(Unknown Source)
    at sun.font.SunLayoutEngine.nativeLayout(Native Method)
    at sun.font.SunLayoutEngine.layout(Unknown Source)
    at sun.font.GlyphLayout$EngineRecord.layout(Unknown Source)
    at sun.font.GlyphLayout.layout(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.createGV(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.getGV(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.createLogicalBounds(Unknown Source)
    at sun.font.ExtendedTextSourceLabel.getAdvance(Unknown Source)
    at java.awt.font.TextLine.init(Unknown Source)
    at java.awt.font.TextLine.<init>(Unknown Source)
    at java.awt.font.TextLine.createLineFromText(Unknown Source)
    at java.awt.font.TextLine.standardCreateTextLine(Unknown Source)
    at java.awt.font.TextLayout.standardInit(Unknown Source)
    at java.awt.font.TextLayout.<init>(Unknown Source)
    at 
org.apache.batik.gvt.text.BidiAttributedCharacterIterator.<init>(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getTextRuns(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getOutline(Unknown Source)
    at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getBounds(Unknown Source)
    at 
org.apache.batik.gvt.renderer.BasicTextPainter.getPaintedBounds(Unknown 
Source)
    at org.apache.batik.gvt.TextNode.getPrimitiveBounds(Unknown Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.CompositeGraphicsNode.getPrimitiveBounds(Unknown 
Source)
    at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.getBounds2D(Unknown 
Source)
    at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.createRendering(Unknown 
Source)
    at org.apache.batik.gvt.renderer.StaticRenderer.renderGNR(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(Unknown 
Source)
    at 
org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(Unknown Source)
    at org.apache.batik.swing.gvt.GVTTreeRenderer.run(Unknown Source)
        ...
        (java.nio.channels.ClosedChannelException repeats ad infinitum)   



Rebuilding Batik 1.1 to include debug information, and running 
standalone yields
the following, slightly different, stack trace:


java.nio.channels.ClosedByInterruptException
        at 
java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
        at sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:293)
        at sun.font.TrueTypeFont.readBlock(TrueTypeFont.java:304)
        at sun.font.FileFont.getGlyphOutline(Native Method)
        at sun.font.FileFontStrike.getGlyphOutline(FileFontStrike.java:648)
        at 
sun.font.CompositeStrike.getGlyphOutline(CompositeStrike.java:151)
        at 
sun.font.StandardGlyphVector$GlyphStrike.appendGlyphOutline(StandardGlyphVector.java:1722)
        at 
sun.font.StandardGlyphVector.getGlyphsOutline(StandardGlyphVector.java:1099)
        at 
sun.font.StandardGlyphVector.getGlyphOutline(StandardGlyphVector.java:329)
        at 
org.apache.batik.gvt.font.AWTGVTGlyphVector.getGlyphOutline(AWTGVTGlyphVector.java:361)
        at 
org.apache.batik.gvt.font.AWTGVTGlyphVector.getOutline(AWTGVTGlyphVector.java:496)
        at 
org.apache.batik.gvt.text.GlyphLayout.getOutline(GlyphLayout.java:171)
        at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getOutline(StrokingTextPainter.java:811)
        at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getBounds(StrokingTextPainter.java:778)
        at 
org.apache.batik.gvt.renderer.BasicTextPainter.getPaintedBounds(BasicTextPainter.java:116)
        at 
org.apache.batik.gvt.TextNode.getPrimitiveBounds(TextNode.java:217)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedPrimitiveBounds(AbstractGraphicsNode.java:877)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:287)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getPrimitiveBounds(CompositeGraphicsNode.java:238)
        at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.getBounds2D(GraphicsNodeRable8Bit.java:144)
        at 
org.apache.batik.gvt.filter.GraphicsNodeRable8Bit.createRendering(GraphicsNodeRable8Bit.java:288)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.renderGNR(StaticRenderer.java:426)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(StaticRenderer.java:458)
        at 
org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(StaticRenderer.java:297)
        at 
org.apache.batik.swing.gvt.GVTTreeRenderer.run(GVTTreeRenderer.java:98)
java.nio.channels.ClosedChannelException
        at sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:89)
        at sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:276)
        at sun.font.TrueTypeFont.readBlock(TrueTypeFont.java:304)
        at sun.font.FileFont.getGlyphOutline(Native Method)
        at sun.font.FileFontStrike.getGlyphOutline(FileFontStrike.java:648)
        at 
sun.font.CompositeStrike.getGlyphOutline(CompositeStrike.java:151)
        at 
sun.font.StandardGlyphVector$GlyphStrike.appendGlyphOutline(StandardGlyphVector.java:1722)
        at 
sun.font.StandardGlyphVector.getGlyphsOutline(StandardGlyphVector.java:1099)        

        at 
org.apache.batik.gvt.font.AWTGVTGlyphVector.getGlyphOutline(AWTGVTGlyphVector.java:361)
        at 
org.apache.batik.gvt.font.AWTGVTGlyphVector.getOutline(AWTGVTGlyphVector.java:496)
        at 
org.apache.batik.gvt.text.GlyphLayout.getOutline(GlyphLayout.java:171)
        at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getOutline(StrokingTextPainter.java:811)
        at 
org.apache.batik.gvt.renderer.StrokingTextPainter.getBounds(StrokingTextPainter.java:778)
        at 
org.apache.batik.gvt.renderer.BasicTextPainter.getPaintedBounds(BasicTextPainter.java:116)
        at 
org.apache.batik.gvt.TextNode.getPrimitiveBounds(TextNode.java:217)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedPrimitiveBounds(AbstractGraphicsNode.java:877)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.batik.gvt.CompositeGraphicsNode.getTransformedPrimitiveBounds(CompositeGraphicsNode.java:282)
        at 
org.apache.batik.gvt.AbstractGraphicsNode.getTransformedBounds(AbstractGraphicsNode.java:843)
        at 
org.apache.bati

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: tiger-beta2 FIXED IN: tiger-beta2 INTEGRATED IN: tiger-b38 tiger-beta2
14-06-2004

EVALUATION Because the bug can be demonstrated by a standalone app, it cannot be a java web start bug. Forwarding to classes_nio for further evaluation. ###@###.### 2004-01-24 Looks like a bug in the font code, forwarding to 2D. -- ###@###.### 2004/1/26 ============================================================================== Yes, there's a vulnerability in the font code. It turns out that batik isn't helping itself though - in fact its shooting itself in the foot. A bug like this has been seen occasionally and non-reproducibly in Java2Demo on a very few occasions. It turns out that the demo is also doing self-inflicted damage but it wasn't as reproducible because the problem - calling Thread.interrupt() is done only occasionally in that demo whereas batik has the following code invoking interrupt a number of times during start-up (display of the splash screen) java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1116) at java.lang.Thread.interrupt(Thread.java:779) at org.apache.batik.swing.gvt.JGVTComponent.scheduleGVTRendering(Unknown Source) ... The "thread" being interrupted is a Batik class : public class GVTTreeRenderer extends Thread looks like its interrupted by a method of a class called JGVTComponent. protected void scheduleGVTRendering() {^M if (gvtTreeRenderer != null) {^M needRender = true;^M gvtTreeRenderer.interrupt();^M } else {^M renderGVTTree();^M }^M It seems that this behaviour causes batik to hang on start-up in JDK 1.4.2 too if you happen to make the system mildly busy at that same time. In 1.5 it became more of an issue because the font code uses NIO and it turns out that NIO is speced such that if an interrupt is pending (ie Thread.interrupt() has been called at some earlier time) that on entry to a read(..) call on a channel NIO detects this and treats it as an interrupt of its read. It closes the channel (and the underlying file) and when the operation ends raises an exception - typically ChannelClosedException, ClosedByInterruptException, or AsynchronousCloseException all of which are subclasses of IOException. In the event that an exception is caught the calling code needs to decide whether it wants to restart the operation. The font code needs to be updated to do this to guard against such behaviours. With such a fix in place batik starts up as well as it did in 1.4.2 (ie there are still *some* hangs, but not font-related ones) although I also notice - the splash screen is too tall with lots of white space - there are TWO main application windows created (at least on Solaris). These problems are unlikely to be related to the hang and would need to be investigated separately. ###@###.### 2004-01-27 ============================
27-01-2004